正则表达式是字符的一个特殊的序列,可帮助匹配或者寻找其他的字符串或一组字符串,用一个模式支持一个专门的语法。正则表达式被广泛应用于UNIX世界中,模块re在Python提供类似Perl的正则表达式全面支持,re模块引发异常re,error如果在编译或使用正则表达式发生错误。
我们将涉及两个重要的功能,这将被用于处理的正则表达式,但是首先:有各种各样的字符,当他们在正则表达式中使用,将有特殊的意义,为了避免在处理正则表达式的任何困惑,将使用原始字符串作为r'expression.
此函数会尝试重新模式匹配字符串可选标志。
下面是次函数的语法:
re.match(pattern,string,flags=0)
这里的参数的说明:
参数 | 描述 |
---|---|
pattern | 这是正则表达式来进行匹配。 |
string | 这是字符串,这将被搜索匹配的模式,在字符串的开头。 |
flags | 可以指定使用位的不同的标志OR (|)。这些改性剂,其列于下表中。 |
re.match函数返回成功,失败匹配对象则返回None,我们会group(num)orgroups()函数匹配对象来获得匹配的表达式。
匹配对象的方法 | 描述 |
---|---|
group(num=0) | 此方法返回整个匹配(或指定分组num) |
groups() | 此方法返回所有元组匹配的子组(空,如果没有) |
例子:
#!/usr/bin/python
imp#!/usr/bin/python
import re
line = "Cats are smarter are big than dogs"
#line = "Cats is smarter than dogs" # No match!!
#matchObj = re.match(r'(.*)are(.*?) .*',line,re.M|re.I)
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
if matchObj:
print ("matchObj.group( ): ",matchObj.group())
print ("matchObj.group(1): ",matchObj.group(1))
print ("matchObj.group(2 ): ",matchObj.group(2))
# print ("matchObj.group(3 ): ", matchObj.group(3))
else:
print ("No match!!")
当执行上面的代码,产生以下结果:
matchObj.group( ): Cats are smarter are big than dogs
matchObj.group(1): Cats are smarter
matchObj.group(2 ): big
import re
phoneNumber=re.compile(r'(\d\d\d)-(\d\d\d)-(\d\d\d\d)')
mo='my number is 7898-3424 jklsdfkl -32 123-345-45789efh123-645-5789wef7987980-0jlkjkl68u8'
number=phoneNumber.search(mo,1)
print(number.group(2))
#是建立Regex对象的时候已经将表达式进行分组了
#错误表达式:phoneNumber=re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')导致除了group()之外,其他的group(0)、group(1)
此函数将搜索字符串中使用可选的标志第一次出现的RE模式。
下面是此函数语法:
re.search(pattern,string,flags=0)
这里的参数的说明:
参数 | 描述 |
---|---|
pattern | 这是正则表达式来进行匹配。 |
string | 这是字符串,这将被搜索到的字符串中的任何位置匹配的模式。 |
flags | 可以指定使用位的不同的标志OR (|)。这些改性剂,其列于下表中。 |
re.search函数返回成功,没有失败的匹配对象,我们会用group(num)或groups()函数来获得匹配的表达式。
匹配对象的方法 | 描述 |
---|---|
group(num=0) | 此方法返回整个匹配(或指定分组num) |
groups() | 此方法返回所有元组匹配的子组(空,如果没有) |
例子:
#!/usr/bin/python
import re
line = "Cats are smarter are big than dogs"
searchObj = re.search(r'(.*) are (.*?) .*',line,re.M|re.I)
if searchObj:
print ("searchObj.group(): ",searchObj.group())
print ("searchObj.group(1): ",searchObj.group(1))
print ("searchObj.group(2): ",searchObj.group(2))
else:
print ("Nothing found!!")
当执行上面的代码,产生以下结果:
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
python提供基于正则表达式两种不同的基本操作:只在字符串的开头匹配检查的匹配,而对于一个匹配字符串中的任何位置搜索检查(这是Perl并在默认情况下)。
#!/usr/bin/python
import re
line = "Cats are smarter than dogs";
# matchObj = re.match(r'.*?dogs',line,re.M|re.I)
matchObj = re.match(r'dogs',line,re.M|re.I)
if matchObj:
print ("match -->matchObj.group() : ",matchObj.group())
else:
print ("No match!!")
searchObj = re.search(r'dogs',line,re.M|re.I)
if searchObj:
print ("search - - > searchObj.group():" ,searchObj.group())
else:
print ("Nothing found!!")
当执行上面的代码,产生以下结果:
No match!!
search - - > searchObj.group(): dogs
一些最重要的re方法,使用正则表达式sub。
re.sub(pattern,repl,string,max=0)
这种方法取代了RE模式字符串中使用的Perl所有匹配,替换说有出现如果提供最大匹配,这个方法将返回修改后的字符串。
例子:
下面是一个例子:
import re
phone = "2004-959-559 # This is Phone Number"
# Delete Python-style comments
num = re.sub(r'#.*$', "", phone)
print ("Phone Num : ", num)
# Remove anything other than digits
num = re.sub(r'D', "", phone)
print ("Phone Num : ", num)
#
num = re.sub(r'd', "", phone)
print ("Phone Num : ", num)
当执行上面的代码,产生以下结果:
Phone Num : 2004-959-559
Phone Num : 2004-959-559 # This is Phone Number
Phone Num : 2004-959-559 # This is Phone Number
正则表达式字面可以包含一个可选的修饰符来控制匹配的各个方面。修饰符被指定为一个可选的标志。可以使用异或提供多个修饰符(|),如先前所示,并且可以由这些中的一个来表示:
修辞符 | 描述 |
---|---|
re.I | 执行不区分大小写的匹配。 |
re.L | 根据当前的语言环境解释词组。这种解释影响字母组(w和W),以及单词边界的行为(b和B) |
re.M | 使$匹配一行(串的不只是端部)的尾部,使^匹配的行(串不只是开始)的开始 |
re.S | 使一个句号(点)匹配任何字符,包括换行符 |
re.U | 根据Unicode字符集解释的字母。这个标志会影响w, W, b, B的行为。 |
re.X | 许可证“cuter”正则表达式语法。它忽略空格(除了一组[]或当用一个反斜杠转义内),并把转义#作为注释标记 |
除了控制字符(+ ? . * ^ $ ( ) [ ] { } | ),所有字符匹配自己。可以通过用反斜杠前就转义控制字符。
下表列出了Python中可用正则表达式语法:
模式 | 描述 |
---|---|
^ | 匹配的开始的 |
$ | 匹配行尾 |
. | 匹配除换行符的任何单个字符。使用-m选项允许其匹配换行符也是如此。 |
[...] | 匹配括号内任何单个字符 |
[^...] | 匹配任何单个字符不在括号中 |
re* | 匹配0个或多个匹配前面表达式。 |
re+ | 匹配1个或多个先前出现的表达式。 |
re? | 匹配0或1前面出现的表达式。 |
re{ n} | 精确匹配n个前面表达式的数量。 |
re{ n,} | 匹配n或多次出现上述表达式。 |
re{ n, m} | 匹配至少n次和前面表达式的大多数出现m次。 |
a| b | 匹配a或b。 |
(re) | 组正则表达式并记住匹配的文本。 |
(?imx) | 暂时切换上 i, m 或 x正则表达式的选项。如果括号中,仅该区域受到影响。 |
(?-imx) | 暂时关闭切换 i, m, 或 x 正则表达式的选项。如果括号中,仅该区域受到影响。 |
(?: re) | 组正则表达式而不匹配的记住文字。 |
(?imx: re) | 暂时切换上i, m, 或 x 括号内的选项。 |
(?-imx: re) | 暂时关闭切换i, m, 或 x 括号内的选项。 |
(?#...) | 注释 |
(?= re) | 指定使用的模式位置,没有一个范围。 |
(?! re) | 指定使用模式取反位置,没有一个范围。 |
(?> re) | 匹配独立的模式而不反向追踪。 |
w | 匹配单词字符。 |
W | 匹配非单词字符 |
s | 匹配的空白,等价于[ tñ r F] |
S | 匹配非空白 |
d | 匹配的数字。等价于[0-9] |
D | 匹配非数字 |
A | 匹配字符串的开始 |
Z | 匹配字符串的结尾。如果一个换行符的存在,它只是换行之前匹配 |
z | 匹配字符串的结尾 |
G | 匹配点,最后一次匹配结束 |
b | 匹配单词边界之外时,括号内。匹配退格键(0×08),括号里面的时候 |
B | 匹配非单词边界 |
n, t, etc. | 匹配换行符,回车符,制表符等 |
1...9 | 匹配第n个分组的子表达式。 |
10 | 匹配,如果它已经匹配第n个分组的子表达式。否则指的是一个字符码的八进制表示。 |
示例 | 描述 |
---|---|
python | 匹配 "python". |
字符类:
示例 | 描述 |
---|---|
[Pp]ython | 匹配 "Python" 或 "python" |
rub[ye] | 匹配 "ruby" 或 "rube" |
[aeiou] | 匹配任何一个小写元音 |
[0-9] | 匹配任何数字;如果[0123456789] |
[a-z] | 匹配任何小写ASCII的字母 |
[A-Z] | 匹配任何大写的ASCII字母 |
[a-zA-Z0-9] | 匹配任何上述的 |
[^aeiou] | 匹配任何不是小写元音 |
[^0-9] | 匹配任何非数字 |
示例 | 描述 |
---|---|
. | 匹配除换行符外的任何字符 |
d | 匹配一个数字:[0-9] |
D | 匹配一个非数字:[^0-9] |
s | 匹配一个空白字符:[ t rñ F] |
S | 匹配非空白:[^ t rñ F] |
w | 匹配一个单词字符:[A-ZA-Z0-9 _] |
W | 匹配非单词字符:[^ A-ZA-Z0-9 _] |
示例 | 描述 |
---|---|
ruby? | 匹配“rub”或“ruby”:y是可选的 |
ruby* | 匹配“rub”加上0个或多个ys |
ruby+ | 匹配“rub”加上1个或多个ys |
d{3} | 完全匹配3个数字 |
d{3,} | 完全匹配3个及以上的数字 |
d{3,5} | 匹配3,4或5个数字 |
匹配最小重复次数:
示例 | 描述 |
---|---|
<.*> | 贪婪的重复:匹配“ |
<.*?> | 非贪婪:匹配“ |
示例 | 描述 |
---|---|
Dd+ | 不分组:+重复d |
(Dd)+ | 分组:+重复Dd对 |
([Pp]ython(, )?)+ | 匹配“Python”,“Python, python, python”等。 |
再次匹配先前匹配的组:
示例 | 描述 |
---|---|
([Pp])ython&1ails | 匹配python&pails或Python&Pails |
(['"])[^1]*1 | 单或双引号字符串。 1匹配第一组匹配。 2匹配第二组匹配等等。 |
示例 | 描述 |
---|---|
python|perl | 匹配"python" 或 "perl" |
rub(y|le)) | 匹配 "ruby" 或 "ruble" |
Python(!+|?) | “Python”后跟一个或多个!或者一个? |
需要指定匹配位置
示例 | 描述 |
---|---|
^Python | 匹配“Python”在一个字符串或内部行的开始 |
Python$ | 匹配“巨蟒”的字符串或行尾 |
APython | 匹配“Python”在字符串的开始 |
PythonZ | 匹配“Python”在字符串的结尾 |
bPythonb | 匹配“Python”在字边界 |
brubB | B非单词的边界:匹配“rub”,“rube”和“ruby”,但并不单独 |
Python(?=!) | 匹配“Python”,如果后面的感叹号 |
Python(?!!) | 匹配“Python”,如果后面不是感叹号 |
示例 | 描述 |
---|---|
R(?#comment) | 符合“R”。其余全是注释 |
R(?i)uby | 当匹配“uby”时,不区分大小写 |
R(?i:uby) | 与上述相同 |
rub(?:y|le)) | 只有组,而无需创建1反向引用 |