.
匹配除了换行符以外的任意字符。*
表示前面的内容可以连续重复任意次。.*
就表示匹配前面任意个除换行符外的字符组成的字符串。
简介
略过。讲讲我的心路历程吧
正则表达式这个我真的是拖了很久才开始接触的东西,现在终于避不过去了,现在有个要探测字符串中是否含有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()
如果没匹配,则返回None
search()
如果没匹配,则返回None
findall()
找到所有的匹配子串,然后返回一个list
finditer()
找到所有的匹配子串,然后返回一个迭代器
我们可以从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
可以用(
和)
来讲许多字符当作一个整体,类似数学计算中的概念。