8

我目前编写了一个 nooby 正则表达式模式,其中涉及过度使用“(”和“)”字符,但我将它们用于“或”运算符,例如 (A|B|C) 表示 A 或 B 或C。

我需要在字符串中找到模式的每个匹配项。
尝试使用该re.findall(pattern, text)方法并不好,因为它将括号字符解释为索引符号(或任何正确的行话),因此生成的 List 的每个元素不是显示匹配文本部分的字符串,而是一个元组(其中包含非常难看的模式匹配片段)。

有没有我可以传递的论点findall来忽略括号作为索引?
或者我将不得不使用一个非常丑陋的组合re.search, 和re.sub

(这是我能想到的唯一解决方案;找到 re.search 的索引,将匹配的文本部分添加到列表中,然后将其从原始字符串中删除{通过使用丑陋的索引技巧},继续此操作直到没有更多匹配。显然,这是可怕的和不可取的)。

谢谢!

4

2 回答 2

15

是的,添加?:到组以使其不被捕获。

import re
print re.findall('(.(foo))', "Xfoo")   # [('Xfoo', 'foo')]
print re.findall('(.(?:foo))', "Xfoo") # ['Xfoo']

有关详细信息,请参阅re 语法

于 2012-08-16T11:03:51.360 回答
1
re.findall(r"(?:A|B|C)D", "BDE")

或者

re.findall(r"((?:A|B|C)D)", "BDE")
于 2012-08-16T11:10:02.217 回答