关与正则表达式中的 括号,请教。

2019-12-21 16:20:40 +08:00
 zitianDai

初学 python,使用正则表达式。
看教程说 “(z|f)ood” 匹配“zood”或“food”
但我使用如下代码测试

s = "zood food"
print(re.findall("(z|f)ood", s))

输出为 ['z', 'f']。 不知道哪里出了问题,请各位指点下,谢谢。

现在有些不理解是括号出了问题,还是|出了问题。

3616 次点击
所在节点    Python
14 条回复
wd
2019-12-21 16:24:28 +08:00
你试试看把 findall 改成 match search 什么的试试
xfspace
2019-12-21 16:25:33 +08:00
[zf]ood
jyyx
2019-12-21 16:26:41 +08:00
应该是把括号()改成中括号[]
zitianDai
2019-12-21 16:29:57 +08:00
@wd 谢谢您恢复,换成 search 后可以匹配出 zood, 那说明我使用 findall 出了问题,因为我想返回一个匹配的列表,使用 findall 是最好的,不知道为什么出了问题。
zitianDai
2019-12-21 16:32:50 +08:00
@xfspace 谢谢回复,这只是一个示例,可能没有写清楚,我实际要用的是 在字符串 "aa bb cc aa cc"中匹配出"aa bb cc","aa cc",我使用"aa(\s*bb\s*|\s*)cc"匹配出了问题,才来询问。
zitianDai
2019-12-21 16:33:30 +08:00
@jyyx 谢谢回复,详细请看#5
jyyx
2019-12-21 16:38:52 +08:00
s = "aa bb cc aa cc"
for i in re.finditer("aa(\s*bb\s*|\s*)cc", s):
print(i.group())
imn1
2019-12-21 16:41:35 +08:00
既不是正则写错了,也不是 findall 出问题,而是 findall 比较特别
它输出的是每个子匹配(一对括号)内的内容
你试试多加几对括号,或者嵌套括号,看看结果就知道了
zitianDai
2019-12-21 16:55:06 +08:00
@imn1 感谢您回复,刚刚我也查到了。findall 存在优先级查询,会优先将括号内容返回,想匹配结果,需要取消权限,使用 "(?:z|f)ood" 可正确匹配出结果。
009694
2019-12-21 17:24:53 +08:00
这个不叫优先级查询 叫非捕获组
009694
2019-12-21 17:26:09 +08:00
实际 (?:z|f)ood 跟 [zf]ood 就是等价的
009694
2019-12-21 17:32:41 +08:00
另外#5 的需求用 aa (?:bb |)cc
wqzjk393
2019-12-21 18:02:35 +08:00
没记错的话小括号主要作用是限制返回的是哪一部分。
frostming
2019-12-21 21:03:34 +08:00
括号会有额外的作用,它会限制 findall 返回的内容为它分组内部的内容

如果你想返回整个匹配,应该用非捕获组(?:) ,或者直接用[zf]替代(推荐后一种)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/631085

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX