应用
1.返回匹配结果 findall&search
1)当有分组时,只将匹配到的字符串里,组的部分放到列表里返回,相当于groups()方法
1.findall
返回所有匹配结果
import re
pattern = re.compile(r'\d+')
pattern.findall("a12b56c54d89") # ['12', '56', '54', '89']
pattern = re.compile(r'\d*([0-9])')
pattern.findall("a124b567c54d892") # ['4', '7', '4', '2'] 只返回了组内的匹配结果
pattern = re.compile(r'\d*([0-9])([0-9])')
pattern.findall("a124b567c54d892") # [('2', '4'), ('6', '7'), ('5', '4'), ('9', '2')] 返回两组组内的匹配结果
2.search返回第一个匹配的结果
3.match从头开始匹配,一般不用再正则表达式用可以用^
来限定
切分字符串 split
将字符串按照数字进行切分,普通的split
函数只能指定具体某个数字
pattern = re.compile(r'[0-9]')
pattern.split("abc1efg2hij3klm")
替换匹配结果 sub
pattern = re.compile(r'\d+')
pattern.sub('000', '123abc456def') # 000abc000def 将所有的数字替换为0
pattern = re.compile(r'\d*(\d)') # 先匹配所有数字
pattern.sub(r'\1','123abc456def') # '3abc6def' 保留数字的个位数,用组内值`\1`代替所有的匹配结果
def func(m):
return str(int(m.group())*2) # m既match匹配对象
pattern = re.compile(r'\d+')
pattern.sub(func,'123abc456def') # 利用m匹配对象,将匹配到的值翻倍
API
1.便捷方法(不编译方法)
不编译方法 | 编译方法 | 描述 |
---|---|---|
re.search(pattern, string, flags=0) | pattern.search(string[, pos[, endpos]]) | 从指定的pos开始搜索到endpos结束,查找第一个能匹配上pattern的部分,并返回相应的匹配对象。 如果字符串中没有位置与模式匹配,则返回None; |
re.match(pattern, string, flags=0) | Pattern.match(string[, pos[, endpos]]) | 这个函数和search差不多,但是,规定一定要从起始位置就得匹配上,否则就不算匹配成功。 |
re.fullmatch(pattern, string, flags=0) | pattern.fullmatch(string[, pos[, endpos]]) | 如果整个字符串匹配此正则表达式,则返回相应的匹配对象。 如果字符串与模式不匹配,则返回None; |
re.split(pattern, string, maxsplit=0, flags=0) | pattern.split(string, maxsplit=0) | 根据表达式规则分拆字符串,返回一个list。 |
re.findall(pattern, string, flags=0) | pattern.findall(string[, pos[, endpos]]) | 返回字符串中模式的所有非重叠匹配项,作为字符串列表。 |
re.finditer(pattern, string, flags=0) | pattern.finditer(string[, pos[, endpos]]) | 返回一个迭代器 |
re.sub(pattern, repl, string, count=0, flags=0) | pattern.sub(repl, string, count=0) | 先通过正则表达式规则找到string中符合规则的部分,然后替换成repl |
re.subn(pattern, repl, string, count=0, flags=0) | pattern.subn(repl, string, count=0) | 不仅返回一个和上面函数一样的字符串,还多返回了一个数字,代表了总共替换的次数 |
参考|
https://www.jianshu.com/p/147fab022566
实例
条件替换,只去掉数字后面的x
import re
text = "100x text"
re.sub(r'(\d+)[xX]', r'\1', text) # 这个是用了分组的思想,把100x,替换成了100,\1是分组的第一个分组
re.sub('(?<=\d)[xX]', '', s) # 这个是利用了分组的特殊构建
参考文献:
http://www.runoob.com/python/python-reg-expressions.html
https://www.cnblogs.com/yyyg/p/5498803.html