.匹配除了换行符以外的任意字符。*表示前面的内容可以连续重复任意次。.*就表示匹配前面任意个除换行符外的字符组成的字符串。
简介
略过。讲讲我的心路历程吧
正则表达式这个我真的是拖了很久才开始接触的东西,现在终于避不过去了,现在有个要探测字符串中是否含有QQ表情和emoji表情的任务。目标语言是python
简单模式
2.1 匹配字符
必须要掌握的是元符号metacharacter。这里有一个完整的元符号列表
.^$*+?{}[]\|()
首先是[和]这两个符号。它们用来表示一组符号,你希望用这组符号之一来匹配,这里面也可以表示一个范围,使用-来连接两个符号,来表示范围。例如[abc]可以匹配a,b或c之一,这个相当于[a-c]。
其他元符号在字符组中不再是元字符的概念。例如[amk$]会匹配下面的任意一个字符a,k,m或$。
如果在字符组的第一个是一个^的话表示这个字符组会匹配不在这个字符组中的任何一个,如果是在外面的话就只是简单地匹配^这个字符。
\是一个转义符,加在元字符前会让这个元字符不在是元字符,而是简单地匹配它本身。类似python中的字符串。同时它也和一些符号也可以组成一些特殊的符号,来表示一些预先定义好的字符组。
\d相当于[0-9]\D相当于[^0-9]\s相当于[\t\n\r\f\v],匹配所有空白字符\S相当于[^\t\n\r\f\v],匹配所有非空白字符\w相当于[a-zA-Z0-9_]\W相当于[^a-zA-Z0-9_]
这符号可以放在字符组中,例如[\s,.]可以匹配任何的非空白字符以及,和.。
还有一个元字符.表示匹配除了回车符号的字符。
2.2 重复的东西
元字符*并不匹配真正的符号*,相反的,它可以匹配让前面部分重复0至任意次数的字符串。遇到带元符号*的表达式,它会尽可能长地匹配子串。它会先尽量长地去先匹配,然后根据后面的字符来不断缩短自己的长度。
另一个可以重复的元字符是+,表示匹配一次或者多次。差别在于这个元字符至少得一次。
元字符?表示匹配一次或者零次。
最复杂的表示重复的元字符是{m,n},m和n是两个整数,$m \leq n$。这个表示对应的部分最少重复m次,最多重复n次。如果m缺了,会自动补上0,如果n缺了,会认为可以最多重复无限多次。当然说无限多次,依然是由机器、软件等限制的。
3 使用正则表达式
首先要把正则表达式编译成一个object,然后在去match他们。
3.1 编译正则表达式
p=re.compile('ab*',re.IGNORECASE)可以忽略大小写。
3.2 backslash灾难
这里会产生很多的麻烦,而且让结果很难理解,因此可以使用字符的前缀r处理字符串,例如r"\n"不再是一个回车了,而是两个字符\和n。
3.3 匹配
match()如果没匹配,则返回Nonesearch()如果没匹配,则返回Nonefindall()找到所有的匹配子串,然后返回一个listfinditer()找到所有的匹配子串,然后返回一个迭代器
我们可以从match object里面通过下面四个函数获得匹配的信息
group()返回匹配的字符串start()`end()`返回开始和结束的位置span()返回一个元组表示(start,end)
3.4 模块级别的函数
可以使用不创建re的object的调用方法,例如re.match(r'From\s+','Fromage amk'),这个方法会在cache中创建object。之后使用相同的RE的话速度会快。
3.5 解释标志
DOTALL和S会让.匹配任何字符,包括换行符。IGNORECASE和I会忽略大小写来进行匹配。LOCALE和L这个会根据你的系统是哪个国家的,改变对应的字符集例如\w的字符范围MULTITLINE和M这个flag会影响到^和$等符号UNICODE和U让\w\W\b\B\d\D\s\S依靠Unicode,这个还有待考察VERBOSE和X这个可以在里面插入用#的注释
更多的模式
更多的元符号
\b是匹配一个词的边界|是一个表示或的符号,但是它的优先级很低,这样可以让它的结果更合理,例如Crow|Servo表示的是匹配Crow和Servo中的其中一个,而不是w货S中的一个。^表示匹配字符串的开端,如果有MULTILINE的标志的话,它也会匹配每个换行,如果只是想匹配在句子首部的单词From的话,可以使用的正则表达式是^From。$匹配的是句尾、行尾或者换行符号的后面的位置\A在没有MULTILINE的情况下和^一样,但是在有MULTILINE的情况下也只匹配字符串首部\Z无论什么情况下也都匹配字符串的尾部\b前面已经介绍过了,但是这里要抢到一个很严重的冲突,如果没有在正则表达式的字符串前加上r的话,python会把\b处理成空格,这样就无法正常匹配了\B则是匹配不是词的边界
4.2 Grouping
可以用(和)来讲许多字符当作一个整体,类似数学计算中的概念。