表1. 正则元字符和语法
符号 | 说明 | 实例 |
---|---|---|
. | 表示任意字符,如果说指定了 DOTALL 的标识,就表示包括新行在内的所有字符。 | ‘abc’ >>>‘a.c’ >>>结果为:‘abc’ |
^ | 表示字符串开头。 | ‘abc’ >>>’^abc’ >>>结果为:‘abc’ |
$ | 表示字符串结尾。 | ‘abc’ >>>‘abc$’ >>>结果为:‘abc’ |
*, +, ? | '*‘表示匹配前一个字符重复 0 次到无限次,’+‘表示匹配前一个字符重复 1次到无限次,’?'表示匹配前一个字符重复 0 次到1次 | ‘abcccd’ >>>‘abc*’ >>>结果为:‘abccc’ ‘abcccd’ >>>‘abc+’ >>>结果为:‘abccc’ ‘abcccd’ >>>‘abc?’ >>>结果为:‘abc’ |
*?, +?, ?? | 前面的*,+,?等都是贪婪匹配,也就是尽可能多匹配,后面加?号使其变成惰性匹配即非贪婪匹配 | ‘abc’ >>>‘abc*?’ >>>结果为:‘ab’ ‘abc’ >>>‘abc??’ >>>结果为:‘ab’ ‘abc’ >>>‘abc+?’ >>>结果为:‘abc’ |
{m} | 匹配前一个字符 m 次 | ‘abcccd’ >>>‘abc{3}d’ >>>结果为:‘abcccd’ |
{m,n} | 匹配前一个字符 m 到 n 次 | ‘abcccd’ >>> ‘abc{2,3}d’ >>>结果为:‘abcccd’ |
{m,n}? | 匹配前一个字符 m 到 n 次,并且取尽可能少的情况 | ‘abccc’ >>> ‘abc{2,3}?’ >>>结果为:‘abcc’ |
\ | 对特殊字符进行转义,或者是指定特殊序列 | ‘a.c’ >>>‘a.c’ >>> 结果为: ‘a.c’ |
[] | 表示一个字符集,所有特殊字符在其都失去特殊意义,只有: ^ - ] \ 含有特殊含义 | ‘abcd’ >>>‘a[bc]’ >>>结果为:‘ab’ |
| | 或者,只匹配其中一个表达式 ,如果|没有被包括在()中,则它的范围是整个正则表达式 | ‘abcd’ >>>'abc |
( … ) | 被括起来的表达式作为一个分组. findall 在有组的情况下只显示组的内容 | ‘a123d’ >>>‘a(123)d’ >>>结果为:‘123’ |
(?#…) | 注释,忽略括号内的内容 特殊构建不作为分组 | ‘abc123’ >>>‘abc(?#fasd)123’ >>>结果为:‘abc123’ |
(?= … ) | 表达式’…’之前的字符串,特殊构建不作为分组 | 在字符串’ pythonretest ’中 (?=test) 会匹配’ pythonre ’ |
(?!..) | 后面不跟表达式’…’的字符串,特殊构建不作为分组 | 如果’ pythonre ’后面不是字符串’ test ’,那么 (?!test) 会匹配’ pythonre ’ |
(?<= … ) | 跟在表达式’…’后面的字符串符合括号之后的正则表达式,特殊构建不作为分组 | 正则表达式’ (?<=abc)def ’会在’ abcdef ’中匹配’ def ’ |
(?:) | 取消优先打印分组的内容 | ‘abc’ >>>’(?:a)(b)’ >>>结果为’[b]’ |
?P<> | 指定Key | ‘abc’ >>>’(?Pa)>>>结果为:groupdict{n1:a} |
表2.特殊序列
特殊表达式序列 | 说明 |
---|---|
\A | 只在字符串开头进行匹配。 |
\b | 匹配位于开头或者结尾的空字符串 |
\B | 匹配不位于开头或者结尾的空字符串 |
\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_] |
\Z | 只在字符串结尾进行匹配 |
说明:
-
在python中的re模块中正则的通常写法采用原始字符串形式(raw string):
a = 'one1two2three3four4' ret = re.findall(r'(\d+)',a)
-
符号说明:
列子1:string1 = "python 是一种 编程 language 吗? 是 | 不是 aaaaaa"; list4 = re.findall("([^是yg]+)", string1); #在[ ]里面的字符会分开一一与字符串匹配 #假设'是[yg]'会解析匹配为'是y','是g'分别去匹配 #在[ ]中的^表示不匹配后面接入的字符 [^…] 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。 结果: ['p', 'thon ', '一种 编程 lan', 'ua', 'e 吗? ', ' | 不', ' aaaaaa']
列子2:
a = "python java C++ js html GO"; list4 = re.findall(r'n(.*)l', a);# 会匹配首尾字符 根据中间括号中的字符串比对输出 print(list4) list4 = re.findall(r'(.*)', a); print(list4) list4 = re.split(r'n(.*)l', a, 1); print(list4); list4 = re.split(r'n (j)a', a);# 去掉括号外面相同的字符,根据括号里面的字符匹配分组 print(list4); 结果: [' java C++ js htm'] ['python java C++ js html GO', ''] ['pytho', ' java C++ js htm', ' GO'] ['pytho', 'j', 'va C++ js html GO']