
初学 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 既不是正则写错了,也不是 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]替代(推荐后一种) |