问题:对于string="jsfd{sdf}df",我想把sdf抽出来变成"jsfd{}df"。
使用patten = re.compile(r"{(.*?)}"),但是发现用findall会找到sdf,用finditer或者sub就会匹配成{sdf},不知道是为什么?正则在什么时候会匹配出两边的括号呢?
问题本身用patten = re.compile(r'(?<={).*?(?=})')已经解决,但是很好奇findall和finditer以及sub匹配出来不同的原因。
问题:对于string="jsfd{sdf}df",我想把sdf抽出来变成"jsfd{}df"。
使用patten = re.compile(r"{(.*?)}"),但是发现用findall会找到sdf,用finditer或者sub就会匹配成{sdf},不知道是为什么?正则在什么时候会匹配出两边的括号呢?
问题本身用patten = re.compile(r'(?<={).*?(?=})')已经解决,但是很好奇findall和finditer以及sub匹配出来不同的原因。
1楼回答正确:
findall 是分组优先返回,没有分组则 返回整个表达式。
finditer或者sub 是 整个表达式优先,finditer可以单独处理分组,sub可以指定替换某些分组。
下面实例展示一下:
import re
string="jsfd{sdf}{测试}df"
patten = re.compile(r"{(.*?)}")
#findall优先返回分组
print("返回满足要求的分组结果",patten.findall(string))
for m in patten.finditer(string):
#根据打印的内容可以判断,finditer返回的只是re.Match object
print("finditer迭代对象-->",m)
#输出匹配的内容
print("满足要求的匹配内容(未分组)-->",m.group())
#需要单独提取内容
print("满足要求的匹配文本(分组后)-->",m.groups())
print("*"*30)
#sub主要用来替换
def change(world):
#根据打印结果可以看出,sub和finditer一样,返回的都是re.Match object
print(world)
# 输出匹配的内容
print("满足要求的匹配内容(未分组)-->", m.group())
# 需要单独提取内容
print("满足要求的匹配文本(分组后)-->", m.groups())
return ""
print("替换后:",re.sub(patten,change,string))
运行结果:
返回满足要求的分组结果 ['sdf', '测试']
finditer迭代对象--> <re.Match object; span=(4, 9), match='{sdf}'>
满足要求的匹配内容(未分组)--> {sdf}
满足要求的匹配文本(分组后)--> ('sdf',)
finditer迭代对象--> <re.Match object; span=(9, 13), match='{测试}'>
满足要求的匹配内容(未分组)--> {测试}
满足要求的匹配文本(分组后)--> ('测试',)
******************************
<re.Match object; span=(4, 9), match='{sdf}'>
满足要求的匹配内容(未分组)--> {测试}
满足要求的匹配文本(分组后)--> ('测试',)
<re.Match object; span=(9, 13), match='{测试}'>
满足要求的匹配内容(未分组)--> {测试}
满足要求的匹配文本(分组后)--> ('测试',)
替换后: jsfddf
参考:
Python实用技法第23篇:正则:文本模式的匹配和查找
Python实用技法第24篇:正则:查找和替换文本
Python实用技法第25篇:正则:以不区分大小写的方式对文本做查找和替换
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
1 回答3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.4k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
findall 是分组优先返回,没有分组则 返回整个表达式。
finditer或者sub 是 整个表达式优先,finditer可以单独处理分组,sub可以指定替换某些分组。