正则表达式是一个特殊的字符序列,它能帮忙你方便的检测一个字符串是不是与某种模式匹配。
Python 自1.5版本起增多了re 模块,它供给 Perl 风格的正则表达式模式。
re 模块使 Python 语言持有所有的正则表达式功能。
compile 函数按照一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象持有一系列办法用于正则表达式匹配和替换。
re 模块亦供给了与这些办法功能完全一致的函数,这些函数运用一个模式字符串做为它们的第1个参数。
本章节重点介绍Python中常用的正则表达式处理函数。
更加多精彩能够点赞+关注私信我
re.match函数
re.match 尝试从字符串的初始位置匹配一个模式,倘若不是初始位置匹配成功的话,match()就返回none。
函数语法: re.match(pattern, string, flags=0)函数参数说明:
实例
#!/usr/bin/python # -*- coding: UTF-8 -*- import re print(re.match(www, www.runoob.com).span()) # 在初始位置匹配 print(re.match(com, www.runoob.com)) # 不在初始位置匹配
以上实例运行输出结果为: (0, 3)
None
实例
#!/usr/bin/python import re line = "Cats are smarter than dogs" 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) else: print "No match!!"
以上实例执行结果如下: matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarterre.search办法
re.search 扫描全部字符串并返回第1个成功的匹配。
函数语法: re.search(pattern, string, flags=0)函数参数说明:
实例
#!/usr/bin/python # -*- coding: UTF-8 -*- import re print(re.search(www, www.runoob.com).span()) # 在初始位置匹配 print(re.search(com, www.runoob.com).span()) # 不在初始位置匹配
以上实例运行输出结果为: (0, 3)
(11, 14)
实例
#!/usr/bin/python import re line = "Cats are smarter 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!!"
以上实例执行结果如下: searchObj.group() : Cats are smarter than dogs
searchObj.group(1) : Cats
searchObj.group(2) : smarterre.match与re.search的区别
re.match只匹配字符串的起始,倘若字符串起始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配全部字符串,直到找到一个匹配。
实例
#!/usr/bin/python import re line = "Cats are smarter than dogs"; matchObj = re.match( rdogs, line, re.M|re.I) if matchObj: print "match --> matchObj.group() : ", matchObj.group() else: print "No match!!" matchObj = re.search( rdogs, line, re.M|re.I) if matchObj: print "search --> searchObj.group() : ", matchObj.group() else: print "No match!!"
以上实例运行结果如下: No match!!
search --> searchObj.group() : dogs
检索和替换
Python 的 re 模块供给了re.sub用于替换字符串中的匹配项。
语法: re.sub(pattern, repl,string, count=0, flags=0)参数: pattern : 正则中的模式字符串。repl : 替换的字符串,亦可为一个函数。string : 要被查询替换的原始字符串。count : 模式匹配后替换的最大次数,默认 0 暗示替换所有的匹配。实例
#!/usr/bin/python # -*- coding: UTF-8 -*- import re phone = "2004-959-559 # 这是一个国外tel号码" # 删除字符串中的 Python注释 num = re.sub(r#.*$, "", phone) print "tel号码是: ", num # 删除非数字(-)的字符串 num = re.sub(r\D, "", phone) print "tel号码是 : ", num
以上实例执行结果如下: tel号码是: 2004-959-559
tel号码是 : 2004959559
repl 参数是一个函数
以下实例中将字符串中的匹配的数字乘以 2:
实例
#!/usr/bin/python # -*- coding: UTF-8 -*- import re # 将匹配的数字乘以 2 def double(matched): value = int(matched.group(value)) return str(value * 2) s = A23G4HFD567 print(re.sub((?P<value>\d+), double, s))
执行输出结果为: A46G8HFD1134re.compile 函数
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数运用。
语法格式为: re.compile(pattern[, flags])参数: pattern : 一个字符串形式的正则表达式flags : 可选,暗示匹配模式,例如忽略体积写,多行模式等,详细参数为:re.I 忽略体积写re.L 暗示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境re.M 多行模式re.S即为. 并且包含换行符在内的任意字符(. 不包含换行符)re.U 暗示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库re.X 为了增多可读性,忽略空格和 # 后面的注释实例
实例
>>>import re >>> pattern = re.compile(r\d+) # 用于匹配最少一个数字 >>> m = pattern.match(one12twothree34four) # 查询头部,无匹配 >>> print m None >>> m = pattern.match(one12twothree34four, 2, 10) # 从e的位置开始匹配,无匹配 >>> print m None >>> m = pattern.match(one12twothree34four, 3, 10) # 从1的位置起始匹配,正好匹配 >>> print m # 返回一个 Match 对象 <_sre.SRE_Match object at 0x10a42aac0> >>> m.group(0) # 可省略 0 12 >>> m.start(0) # 可省略 0 3 >>> m.end(0) # 可省略 0 5 >>> m.span(0) # 可省略 0 (3, 5)
在上面,当匹配成功时返回一个 Match 对象,其中: group([group1, …]) 办法用于得到一个或多个分组匹配的字符串,当要得到全部匹配的子串时,可直接运用 group() 或 group(0);start([group]) 办法用于获取分组匹配的子串在全部字符串中的初始位置(子串第1个字符的索引),参数默认值为 0;end([group]) 办法用于获取分组匹配的子串在全部字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;span([group]) 办法返回 (start(group), end(group))。再瞧瞧一个例子:
实例
>>>import re >>> pattern = re.compile(r([a-z]+) ([a-z]+), re.I) # re.I 暗示忽略体积写 >>> m = pattern.match(Hello World Wide Web) >>> print m # 匹配成功,返回一个 Match 对象 <_sre.SRE_Match object at 0x10bea83e8> >>> m.group(0) # 返回匹配成功的全部子串 Hello World >>> m.span(0) # 返回匹配成功的全部子串的索引 (0, 11) >>> m.group(1) # 返回第1个分组匹配成功的子串 Hello >>> m.span(1) # 返回第1个分组匹配成功的子串的索引 (0, 5) >>> m.group(2) # 返回第二个分组匹配成功的子串 World >>> m.span(2) # 返回第二个分组匹配成功的子串 (6, 11) >>> m.groups() # 等价于 (m.group(1), m.group(2), ...) (Hello, World) >>> m.group(3) # 不存在第三个分组 Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: no such group
findall
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,倘若无找到匹配的,则返回空列表。
重视: match 和 search 是匹配一次 findall 匹配所有。
语法格式为: findall(string[, pos[, endpos]])参数: string : 待匹配的字符串。pos : 可选参数,指定字符串的初始位置,默认为 0。endpos: 可选参数,指定字符串的结束位置,默认为字符串的长度。查询字符串中的所有数字:
实例
# -*- coding:UTF8 -*- import re pattern = re.compile(r\d+) # 查询数字 result1 = pattern.findall(runoob 123 google 456) result2 = pattern.findall(run88oob123google456, 0, 10) print(result1) print(result2)
输出结果: [123, 456]
[88, 12]
re.finditer
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们做为一个迭代器返回。 re.finditer(pattern, string, flags=0)
实例
# -*- coding: UTF-8 -*- import re it = re.finditer(r"\d+","12a32bc43jf3") for match in it: print (match.group() )
输出结果: 12
32
43
3
re.split
split 办法根据能够匹配的子串将字符串分割后返回列表,它的运用形式如下: re.split(pattern, string[, maxsplit=0, flags=0])
实例
>>>import re >>> re.split(\W+, runoob, runoob, runoob.) [runoob, runoob, runoob, ] >>> re.split((\W+), runoob, runoob, runoob.) [, , runoob, , , runoob, , , runoob, ., ] >>> re.split(\W+, runoob, runoob, runoob., 1) [, runoob, runoob, runoob.] >>> re.split(a*, hello world) # 针对一个找不到匹配的字符串而言,split 不会对其作出分割 [hello world]
正则表达式对象
re.RegexObject
re.compile() 返回 RegexObject 对象。
re.MatchObject
group() 返回被 RE 匹配的字符串。 start() 返回匹配起始的位置end() 返回匹配结束的位置span() 返回一个元组包括匹配 (起始,结束) 的位置正则表达式修饰符 - 可选标志
正则表达式能够包括有些可选标志修饰符来掌控匹配的模式。修饰符被指定为一个可选的标志。多个标志能够经过按位 OR(|) 她们来指定。如 re.I | re.M 被设置成 I 和 M 标志:
正则表达式模式
模式字符串运用特殊的语法来暗示一个正则表达式:
字母和数字暗示她们自己。一个正则表达式模式中的字母和数字匹配一样的字符串。
都数字母和数字前加一个反斜杠时会持有区别的含义。
标点符号仅有被转义时才匹配自己,否则它们暗示特殊的含义。
反斜杠本身必须运用反斜杠转义。
因为正则表达式一般都包括反斜杠,因此你最好运用原始字符串来暗示它们。模式元素(如 r\t,等价于 \\t)匹配相应的特殊字符。
下表列出了正则表达式模式语法中的特殊元素。倘若你运用模式的同期供给了可选的标志参数,某些模式元素的含义会改变。
正则表达式实例
|