Python中re模块下的函数详解
作者:sodaloveer
一、re模块下的函数
1.re.match()
re.match() 函数是从头开始匹配一个符合规则的字符串,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None。
函数语法:
re.match(pattern,string,flags=0)
参数说明如下:
参数 | 描述 |
pattern | 匹配正则表达式 |
string | 要匹配的字符串 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等 |
要求:匹配"hello"字符串。
import re result=re.match("hello","hello world") print(result)
输出结果:
<re.Match object; span=(0, 5), match=‘hello’>
2.re.search()
re.search() 函数会在整个字符串内查找匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None。
函数语法:
re.search(pattern,string,flags=0)
参数说明如下:
参数 | 描述 |
pattern | 匹配正则表达式 |
string | 要匹配的字符串 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等 |
要求:匹配出文章阅读的次数。
import re ret = re.search(r"\d+", "阅读次数为 9999") print(ret.group())
输出结果:
9999
3.re.fullmatch()
re.fullmatch() 函数要求整个字符串完全匹配到正则表达式,就返回一个相应的匹配对象,否则就返回一个None。
函数语法:
re.fullmatch(pattern, string, flags=0)
参数说明如下:
参数 | 描述 |
pattern | 匹配正则表达式 |
string | 要匹配的字符串 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等 |
要求:匹配出"hello"字符串。
import re result=re.fullmatch("hello","hello world") if result: print(result.group()) else: print("匹配失败!")
输出结果:
匹配失败!
re.match() 、re.search() 和 re.fullmatch()三者区别
- match()函数只检测RE是不是在string的开始位置匹配
- search()函数会扫描整个string查找匹配
- fullmatch()函数会扫描整个string是否完全匹配
- match()只有在0位置匹配成功才有返回,如果不是开始位置匹配成功的话,match()则返回none。fullmatch()要整个字符串完全匹配上,从0位置开始到结束位置,如果不是,fullmatch()则返回none。
import re print(re.match('super', 'superstition').span()) print(re.match('super','insuperable'))
输出结果:
(0, 5) None
import reprint(re.search('super','superstition').span())print(re.search('super','insuperable').span())
输出结果:
(0, 5) (2, 7)
import re print(re.search('super','superstition').span()) print(re.search('super','insuperable').span())
输出结果:
None None super
4.re.findall()
re.findall() 函数在字符串中找到正则表达式所匹配的所有子串,按顺序返回一个列表,如果没有找到匹配的,则返回空列表。
函数语法:
re.findall(pattern,string,flags=0)
参数说明如下:
参数 | 描述 |
pattern | 匹配正则表达式 |
string | 要匹配的字符串 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等 |
要求:匹配出所有的数字。
import re print(re.findall(r"\d+","abafa 124ddwa56"))
输出结果:
[‘124’, ‘56’]
要求:匹配出f开头且左边是空字符串的单词。
import re print(re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest'))
输出结果:
[‘foot’, ‘fell’, ‘fastest’]
如果有多个组,返回与这些匹配的字符串元组列表。
import re print(re.findall(r'(\w+)=(\d+)', 'set width=20 and height=10'))
输出结果:
[(‘width’, ‘20’), (‘height’, ‘10’)]
5.re.finditer()
re.finditer() 函数在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
函数语法:
re.finditer(pattern,string,flags=0)
参数说明如下:
参数 | 描述 |
pattern | 匹配正则表达式 |
string | 要匹配的字符串 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等 |
要求:匹配出所有的数字。
import re it = re.finditer(r"\d+", "12a32bc43jf3") for match in it: print(match.group())
输出结果:
12 32 43 3
6.re.split()
re.split() 函数按照能够匹配子串将字符串分割后返回列表。
函数语法:
re.split(pattern, string[, maxsplit=0, flags=0])
参数说明如下:
参数 | 描述 |
pattern | 匹配正则表达式 |
string | 要匹配的字符串 |
maxsplit | 分隔次数,maxsplit=1分隔一次,默认为0,不限制次数。 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等 |
用pattern分隔开string。
要求:用非a-zA-Z0-9_字符切分字符串。
import re re.split(r'\W+','Words, words, words.')
输出结果:
[‘Words’, ‘words’, ‘words’, ‘’]
如果maxsplit非零,最多进行maxsplit分隔,剩下的字符全部返回到列表的最后一个元素。
要求:用非a-zA-Z0-9_字符切分字符串且只分隔一次。
re.split(r'\W+', 'Words, words, words.', 1)
输出结果:
[‘Words’, ‘words, words.’]
如果pattern中捕获到括号,那么所有的组里的文字也会包含在列表里。
re.split(r'(\W+)', 'Words, words, words.')
输出结果:
[‘Words’, ', ', ‘words’, ', ', ‘words’, ‘.’, ‘’]
如果分隔符里有捕获组合,并且在匹配字符串的开始,那么结果将会以一个空字符串开始,对于结尾也是一样。
re.split(r'(\W+)', '...words, words...')
输出结果:
[‘’, ‘…’, ‘words’, ', ', ‘words’, ‘…’, ‘’]
用正则表达式切分字符串比用固定的字符更灵活。
正常的切分代码:
'a b c'.split(' ')
输出结果:
[‘a’, ‘b’, ‘’, ‘’, ‘c’]
无法识别连续的空格,用正则表达式试试:
import re print(re.split(r'\s+','a b c')) #无论多少个空格都可以正常分割。加入, print(re.split(r'[\s\,]+', 'a,b, c d')) #再加入; print(re.split(r'[\s\,\;]+', 'a,b;; c d'))
输出结果:
[‘a’, ‘b’, ‘c’] [‘a’, ‘b’, ‘c’, ‘d’] [‘a’, ‘b’, ‘c’, ‘d’]
7.re.sub()
re.sub() 函数用于替换字符串中的匹配项。
函数语法:
re.sub(pattern, repl, string, count=0, flags=0)
参数说明如下:
参数 | 描述 |
pattern | 匹配正则表达式 |
repl | 替换的字符串,也可以是一个函数。 |
string | 要被查找替换的原始字符串。 |
count | 模式匹配后替换的最大次数,默认0表示替换所有的匹配。 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等 |
前三个必选参数,后两个为可选参数。
要求:删除注释,移除非数字的内容。
import re phone = "2004-959-559 # 这是一个电话号码" # 删除注释 num = re.sub(r'#.*$', "", phone) print("电话号码 : ", num) # 移除非数字的内容 num = re.sub(r'\D', "", phone) print("电话号码 : ", num)
输出结果:
电话号码 : 2004-959-559
电话号码 : 2004959559
repl参数可以是一个函数,正则表达式使用了 (?P…) 语法,将匹配到的数字部分的字符串命名为value。
要求:将匹配的数字乘于 2。
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))
输出结果:
A46G8HFD1134
8.re.compile()
re.compile() 函数将正则表达式的样式编译为一个正则表达对象(正则对象),可以用于匹配,通过这个对象的方法match(),search()以及其他。
这个表达式的行为可以通过指定标记的值来改变,值可以是以下任意变量。
prog=re.compile(pattern) result=prog.match(string)
等价于
result=re.match(pattern,string)
如果需要多次使用这个正则表达式的话,使用re.compile()和保存这个正则对象以便利用,可以让程序更加高效。
正则对象的方法和属性
用compile编译后的正则表达式对象支持以下方法和属性:
pattern.search(string[, pos[, endpos]]) 扫描整个string寻找第一个匹配的位置,并返回一个相应的匹配对象。如果没有匹配,就返回None。
pos参数可以选择字符串开始搜索的位置索引,默认为0,它不完全等价于字符串切片,'^'样式字符匹配字符串真正的开关,和换行符后面的第一个字符,但不会匹配索引 规定开始的位置。
可选的参数endpos限定了字符串搜索的结束,它假定字符串长度到endpos,所以只有从pos到endpos-1的字符会被匹配,如果endpos小于pos,就不会有匹配产生,另个,如果rx是一个编译后的正则对象,rx.search(string,0,50) 等价于rx.search(string[:50],0)。
import re pattern=re.compile("o") print(pattern.search("dog")) print(pattern.search("dog",2))
输出结果:
<re.Match object; span=(1, 2), match=‘o’> None
- pattern.match(string[, pos[, endpos]]) 如果 string 的 开始位置 能够找到这个正则样式的任意个匹配,就返回一个相应的 匹配对象。如果不匹配,就返回 None。
pos参数可以选择字符串开始搜索的位置索引,默认为0,它不完全等价于字符串切片,'^'样式字符匹配字符串真正的开关,和换行符后面的第一个字符,但不会匹配索引 规定开始的位置。
import re pattern=re.compile("o") print(pattern.match("dog")) print(pattern.match("dog",1))
输出结果:
None
<re.Match object; span=(1, 2), match=‘o’>
- pattern.fullmatch() 如果整个string匹配这个正则表达式,就返回一个相应的匹配对象。否则就返回None。
可选参数 pos 和 endpos 与 search() 含义相同。
import re pattern=re.compile("o[gh]") print(pattern.fullmatch("dog")) print(pattern.fullmatch("ogre")) print(pattern.fullmatch("doggie",1,3))
输出结果:
None None <re.Match object; span=(1, 3), match=‘og’>
- pattern.findall(string[, pos[, endpos]]) 类似函数 findall() , 使用了编译后样式,但也可以接收可选参数 pos 和 endpos ,限制搜索范围,就像 search()。
- pattren.finditer(string[, pos[, endpos]]) 类似函数 finditer() , 使用了编译后样式,但也可以接收可选参数 pos 和 endpos ,限制搜索范围,就像 search()。
- pattern.split(string, maxsplit=0) 等价于 split() 函数,使用了编译后的样式。
- pattern.sub(repl, string, count=0) 等价于 sub() 函数,使用了编译后的样式。
二、re模块下函数的匹配对象
正则表达式的函数一旦匹配成功,就是object对象,匹配对象支持以下方法和属性:
group() 返回被 RE 匹配的字符串
如果只有一个参数,结果就是一个字符串,如果没有参数,默认为0,相应的返回值就是整个匹配字符串。
m=re.match(r"(\w+) (\w+)", "I love you, Tom") m.group() m.group(0)
输出结果:
‘I love’
如果它是一个范围[1…99],结果就是相应的括号组字符串。
m.group(1) m.group(2)
输出结果:
‘I’ ‘love’
如果有多个参数,结果就是一个元组,第个参数对应一个。
m.group(1,2)
输出结果:
(‘I’, ‘love’)
如果正则表达式使用了(?P…) 语法, groupN 参数就也可能是命名组合的名字。如果一个字符串参数在样式中未定义为组合名,就引发一个 IndexError 异常。
import re m=re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds") print(m.group("first_name")) print(m.group("last_name"))
输出结果:
Malcolm Reynolds
命名组合同样可以通过索引值引用
print(m.group(1)) print(m.group(2))
输出结果:
Malcolm Reynolds
3.6版本后可以直接Match.getitem(g),等价于m.group(g)。
print(m[1]) print(m[2])
print(m['first_name']) print(m['last_name'])
输出结果:
Malcolm Reynolds
- start() 返回匹配开始的位置
- end() 返回匹配结束的位置
- span() 返回一个元组包含匹配 (开始,结束) 的位置
import re result=re.match("hello","hello world") print(result.start()) print(result.end()) print(result.span())
输出结果:
0
5
(0, 5)
匹配对象总是有一个布尔值 True。 所以可以简单的用 if 语句来判断是否匹配
import re result=re.match("hello","hello world") if result: print(result.group()) else: print("匹配失败!")
输出结果:
hello
到此这篇关于Python中re模块下的函数详解的文章就介绍到这了,更多相关Python的re模块内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!