为何同样的Pattern,sub和findall找出来的结果不一样?

新手上路,请多包涵

问题:对于string="jsfd{sdf}df",我想把sdf抽出来变成"jsfd{}df"。
使用patten = re.compile(r"{(.*?)}"),但是发现用findall会找到sdf,用finditer或者sub就会匹配成{sdf},不知道是为什么?正则在什么时候会匹配出两边的括号呢?

问题本身用patten = re.compile(r'(?<={).*?(?=})')已经解决,但是很好奇findall和finditer以及sub匹配出来不同的原因。

阅读 3k
2 个回答

findall 是分组优先返回,没有分组则 返回整个表达式。
finditer或者sub 是 整个表达式优先,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篇:正则:以不区分大小写的方式对文本做查找和替换

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题