首页 > 代码库 > python正则表达式记录

python正则表达式记录

元字符:

 

*  星号   它指定前一个字符可以被匹配零次或更多次 

>>> re.match(a[bcd]*b, abcbdabcd).group()
abcb
>>> re.match(a[bcd]*b, abcbdbcd).group()
abcbdb
>>>

 

匹配a和b之间的字符,如果有,那么继续直到没有为止。所以它是贪婪匹配。

 

如果a和b之间有字符,但是不是bcd中的任意一个那么将会停止,取到上次匹配的结果。

 

 

+  加号   指定前边的字符一次或者更多次。区别于 * 的是,至少需要一次。

>>> re.match(c+t, ctct).group()
ct
>>> re.match(c+t, tct).group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: NoneType object has no attribute group
>>>

+  是非贪婪匹配。只要满足条件找到一个就结束。

 

?  问号   匹配一次或零次  可以认为它用于标识某事物是可选的。例如:home-?brew 匹配 "homebrew" 或 "home-brew"。

>>> re.match(www-?mmm, www-mmm).group()
www-mmm
>>> re.match(www-?mmm, wwwmmm).group()
wwwmmm
>>>

可以看到有无 - 减号都可以

 

最复杂的重复限定符是 {m,n}(注意m,n之间不能有空格),其中 m 和 n 是十进制整数。

该限定符的意思是至少有 m 个重复,至多到 n 个重复。

举个例子,a/{1,3}b 将匹配 "a/b","a//b" 和 "a///b"。它不能匹配 "ab" 因为没有斜杠,也不能匹配 "a////b" ,因为有四个。

 

>>> re.match(a/{1,3}b, a/b).group()      #一个斜杠
a/b
>>> re.match(a/{1,3}b, ab).group()       #没有斜杠
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: NoneType object has no attribute group
>>> re.match(a/{1,3}b, a////b).group()    #四个斜杠
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: NoneType object has no attribute group
>>>

 

细心的读者也许注意到其他三个限定符都可以用这样方式来表示。

{0,}  等同于 *,{1,}  等同于 +,而 {0,1} 则与 ? 相同。

如果可以的话,最好使用 *,+,或?。很简单因为它们更短也更容易懂。

 

python正则表达式记录