初学 python,使用正则表达式。
看教程说 “(z|f)ood” 匹配“zood”或“food”
但我使用如下代码测试
s = "zood food"
print(re.findall("(z|f)ood", s))
输出为 ['z', 'f']。 不知道哪里出了问题,请各位指点下,谢谢。
现在有些不理解是括号出了问题,还是|出了问题。
1
wd 2019-12-21 16:24:28 +08:00 via iPhone
你试试看把 findall 改成 match search 什么的试试
|
2
xfspace 2019-12-21 16:25:33 +08:00 via Android
[zf]ood
|
3
jyyx 2019-12-21 16:26:41 +08:00
应该是把括号()改成中括号[]
|
4
zitianDai OP @wd 谢谢您恢复,换成 search 后可以匹配出 zood, 那说明我使用 findall 出了问题,因为我想返回一个匹配的列表,使用 findall 是最好的,不知道为什么出了问题。
|
5
zitianDai OP @xfspace 谢谢回复,这只是一个示例,可能没有写清楚,我实际要用的是 在字符串 "aa bb cc aa cc"中匹配出"aa bb cc","aa cc",我使用"aa(\s*bb\s*|\s*)cc"匹配出了问题,才来询问。
|
7
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()) |
8
imn1 2019-12-21 16:41:35 +08:00 1
既不是正则写错了,也不是 findall 出问题,而是 findall 比较特别
它输出的是每个子匹配(一对括号)内的内容 你试试多加几对括号,或者嵌套括号,看看结果就知道了 |
9
zitianDai OP @imn1 感谢您回复,刚刚我也查到了。findall 存在优先级查询,会优先将括号内容返回,想匹配结果,需要取消权限,使用 "(?:z|f)ood" 可正确匹配出结果。
|
10
009694 2019-12-21 17:24:53 +08:00 via iPhone
这个不叫优先级查询 叫非捕获组
|
11
009694 2019-12-21 17:26:09 +08:00 via iPhone
实际 (?:z|f)ood 跟 [zf]ood 就是等价的
|
12
009694 2019-12-21 17:32:41 +08:00 via iPhone
另外#5 的需求用 aa (?:bb |)cc
|
13
wqzjk393 2019-12-21 18:02:35 +08:00 via iPhone
没记错的话小括号主要作用是限制返回的是哪一部分。
|
14
frostming 2019-12-21 21:03:34 +08:00
括号会有额外的作用,它会限制 findall 返回的内容为它分组内部的内容
如果你想返回整个匹配,应该用非捕获组(?:) ,或者直接用[zf]替代(推荐后一种) |