-
正则表达式主要用于对字符串进行特定的处理,如判断一串字符是否是手机号,一串字符中是否含有某些特定的字符,等等。
-
Python中正则表达式的使用:
import re str1 = "leon" str2 = "leonisagoodman" result = re.match(str1,str2) result.group()
上面代码输出结果为:
"leon"
- 其中 str1 为pattern,即为某种特定的规则表示,str2为要匹配的字符串,如果str2满足str1的特定规则,则re.match()会返回一个匹配对象(Match Object),如果不满足,则会返回None(注意不是空字符串"",因为空字符串也可能是某种规则).
- 如果用match方法匹配到数据的话,则可以调用group方法来提取数据。
- 单字符的匹配:
字符 | 功能 |
---|---|
. | 匹配任意单个字符(除了\n) |
\d | 匹配任意单个数字 |
\D | 匹配任意单个非数字 |
[] | 匹配[]中列举的字符,[]中^为脱字符的意思,即除了[]里面列举的字符 |
\s | 匹配空白,如空格、\t、\n等 |
\S | 匹配非空白 |
\w | 匹配单词字符(0-9、a-z、A-Z、_) |
\W | 匹配非单词字符 |
其中“ [] ”可以将上面的所有规则表示出来,如下所示:
字符 | 用[]代替表示 |
---|---|
. | re.match("[^\n]",“XXX”) |
\d | re.match("[0-9]",“XXX”) |
\D | re.match("[^0-9]",“XXX”) |
\s | re.match("[此处为表示空白的所有字符]",“XXX”) |
\S | re.match("[^此处为表示空白的所有字符]",“XXX”) |
\w | re.match("[0-9a-zA-Z_]",“XXX”) |
\W | re.match("[^0-9a-zA-Z_]",“XXX”) |
- 表示数量
用于对多个字符的表示。
字符 | 功能 |
---|---|
* | 表示0个或者任意个字符 |
+ | 表示1个或者任意个字符,至少1个 |
? | 表示0个或者1个字符 |
{m} | 表示m个字符 |
{m,} | 表示至少m个字符 |
{m,n} | 表示至少m个字符,至多n个字符 |
示例如下:
re.match("\d*","XXX") #匹配字符串中0个或者任意多个数字
re.match("\d+","XXX") #匹配字符串中至少1个数字
re.match("\d?","XXX") #匹配字符串中0个或者1个数字
re.match("\d{3}","XXX") #匹配字符串中3个数字
re.match("\d{3,}","XXX") #匹配字符串中至少三个数字
re.match("\d{3,5}","XXX") #匹配字符串中至少三个数字,至多5个数字
同样可以用 {} 将 * + ?分别表示出来,如下表:
字符 | 用{}代替表示 |
---|---|
* | {0,} |
+ | {1,} |
? | {0,1} |
-
原始字符串
Python中字符串前面加上 r 表示原始字符串。原始字符串很好的解决了转义字符“\”的困扰。如下:
即 如果字符串“\nabc”前面加上 “ r ”,则解释器会自动的将这个字符串变成 “\nabc”。
所以在匹配字符串 "\nabc"时,可以直接写成re.match(r"\nabc","\nabc")
,而不用写成re.match("\\nabc","\nabc")
,所以有了原始字符串就再也不用担心是不是漏写了反斜杠。应该养成习惯在前面加上“ r ”。注意点:
-
表示边界
字符 | 功能 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
\b | 匹配一个单词的边界 |
\B | 匹配非单词边界 |
示例如下:
- 表示分组
字符 | 功能 |
---|---|
| | 匹配左右任意一个表达式 |
() | 将括号中的字符作为一个分组 |
\num | 引用分组num匹配到的字符串 |
(?P<name>) | 给分组命名 |
(?P=name) | 引用分组名为name的分组匹配到的字符串 |
示例如下:
- re的一些高级用法
- search() 和 findall()
search用来搜索从左到右第一个匹配到的字符串,返回的是match对象。
findall 用来搜索从左到右匹配到的所有字符串。注意:用findall返回的是一个列表,而不是match对象
用法如下图所示:
- sub()
sub用来用特定的字符串将匹配到的字符串进行替换,也可以将匹配到的字符串传进定义的函数里,进行处理后进行替换。用法如下图:
- split()
split根据匹配进行切割字符串,并返回一个列表。用法如下:
- 贪婪模式
看下图:
会发现原本希望将后面的数字全部匹配到一起,结果前面两个8却匹配到了第一个分组中,这是因为第一个分组(.+)
中的+
是处于贪婪模式,它会在匹配的时候最大限度的满足自己,使后面分组(\d+-\d+-\d+)
中的第一个\d+
最小限度的满足即可(即第一个\d+
只会匹配到一个8
,而.+
则匹配到The number is 88
)
关闭贪婪模式的方法为:给该匹配字符后面加?
。如下图: