#python之正则表达式
第三方模块 regex , 提供了与标准库
re
模块兼容的API接口, 同时还提供了额外的功能和更全面的Unicode支持。
正则表达式语法
正则表达式可以拼接; 如果 A 和 B 都是正则表达式, 那么 AB 也是正则表达式。 通常, 如果字符串 p 匹配 A并且另一个字符串 q 匹配 B, 那么 pq 可以匹配 AB。除非 A 或者 B 包含低优先级操作,A 和 B 存在边界条件;或者命名组引用。
特殊字符 | 意义 |
---|---|
. | (点) 在默认模式,匹配除了换行的任意字符。如果指定了标签 DOTALL ,它将匹配包括换行符的任意字符。 |
^ | 插入符号) 匹配字符串的开头, 并且在 MULTILINE 模式也匹配换行后的首个符号。 |
$ | 匹配字符串尾或者换行符的前一个字符,在 MULTILINE 模式匹配换行符的前一个字符。foo 匹配 'foo' 和 'foobar' , 但正则 foo$ 只匹配 'foo' |
* | 对它前面的正则式匹配0到任意次重复, 尽量多的匹配字符串。 ab* 会匹配 'a' , 'ab' , 或者 'a'` 后面跟随任意个 ‘b’`。 |
+ | 对它前面的正则式匹配1到任意次重复。 ab+ 会匹配 'a' 后面跟随1个以上到任意个 'b' ,它不会匹配 'a' 。 |
? | 对它前面的正则式匹配0到1次重复。 ab? 会匹配 'a' 或者 'ab' 。 |
*?, +?, ?? |
'*' , '+' ,和 '?' 修饰符都是 贪婪的;它们在字符串进行尽可能多的匹配。有时候并不需要这种行为。如果正则式 <.*> 希望找到 '<a> b <c>' ,它将会匹配整个字符串,而不仅是 '<a>' 。在修饰符之后添加 ? 将使样式以 非贪婪方式或者:dfn: 最小 方式进行匹配; 尽量 少 的字符将会被匹配。 使用正则式 <.*?> 将会仅仅匹配 '<a>' 。 |
{m} | 对其之前的正则式指定匹配 m 个重复;少于 m 的话就会导致匹配失败。比如, a{6} 将匹配6个 'a' , 但是不能是5个。 |
{m, n} | 对正则式进行 m 到 n 次匹配,在 m 和 n 之间取尽量多。 比如,a{3,5} 将匹配 3 到 5个 'a' 。忽略 m 意为指定下界为0,忽略 n 指定上界为无限次。 比如 a{4,}b 将匹配 'aaaab' 或者1000个 'a' 尾随一个 'b' ,但不能匹配 'aaab' 。逗号不能省略,否则无法辨别修饰符应该忽略哪个边界。 |
{m,n}? | 前一个修饰符的非贪婪模式,只匹配尽量少的字符次数。比如,对于 'aaaaaa' , a{3,5} 匹配 5个 'a' ,而 a{3,5}? 只匹配3个 'a' 。 |
\ | 转义特殊字符(允许你匹配 '*' , '?' , 或者此类其他) |
[] | 用于表示一个字符集合 |
字符可以单独列出,比如 [amk] 匹配 'a' , 'm' , 或者 'k' 。 |
|
可以表示字符范围,通过用 '-' 将两个字符连起来。比如 [a-z] 将匹配任何小写ASCII字符, [0-5][0-9] 将匹配从 00 到 59 的两位数字, [0-9A-Fa-f] 将匹配任何十六进制数位。 如果 - 进行了转义 (比如 [a\-z] )或者它的位置在首位或者末尾(如 [-a] 或 [a-] ),它就只表示普通字符 '-' 。 |
|
特殊字符在集合中,失去它的特殊含义。比如 [(+*)] 只会匹配这几个文法字符 '(' , '+' , '*' , or ')' 。 |
|
不在集合范围内的字符可以通过 取反 来进行匹配。如果集合首字符是 '^' ,所有 不 在集合内的字符将会被匹配,比如 [^5] 将匹配所有字符,除了 '5' , [^^] 将匹配所有字符,除了 '^' . ^ 如果不在集合首位,就没有特殊含义。 |
|
在集合内要匹配一个字符 ']' ,有两种方法,要么就在它之前加上反斜杠,要么就把它放到集合首位。比如, [()[\]{}] 和 []()[{}] 都可以匹配括号。 |
|
(?P\ |
(命名组合)类似正则组合,但是匹配到的子串组在外部是通过定义的 name 来获取的。组合名必须是有效的Python标识符,并且每个组合名只能用一个正则表达式定义,只能定义一次。一个符号组合同样是一个数字组合,就像这个组合没有被命名一样。如果样式是 (?P<quote>['"]).*?(?P=quote) (也就是说,匹配单引号或者双引号括起来的字符串) |
(?P=name) | 反向引用一个命名组合;它匹配前面那个叫 name 的命名组中匹配到的串同样的字串。 |
(?=…) | 匹配 … 的内容,但是并不消费样式的内容。这个叫做 lookahead assertion。比如, Isaac (?=Asimov) 匹配 'Isaac ' 只有在后面是 'Asimov' 的时候。 |
(?!=…) | 匹配 … 不符合的情况。这个叫 negative lookahead assertion (前视取反)。比如说, Isaac(?!Asimov) 只有后面 不 是 'Asimov' 的时候才匹配 'Isaac ' 。 |
(?<=…) | 匹配字符串的当前位置,它的前面匹配 … 的内容到当前位置。这叫:dfn:positive lookbehind assertion(正向后视断定)。 (?<=abc)def 会在 'abcdef' 中找到一个匹配,因为后视会往后看3个字符并检查是否包含匹配的样式。 |
语法示例
1 | import re |