Python regex - 忽略括号作为索引?

Posted

技术标签:

【中文标题】Python regex - 忽略括号作为索引?【英文标题】:Python regex - Ignore parenthesis as indexing? 【发布时间】:2012-08-12 17:05:11 【问题描述】:

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

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

我是否可以将参数传递给 findall 以忽略括号作为索引? 还是我必须使用re.searchre.sub的非常丑陋的组合

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

谢谢!

【问题讨论】:

您能否向我们展示您尝试匹配/捕获的样本和不匹配的样本? 可能你的正则表达式可以改进 =) 例如,re.findall(r"(A|B|C)D", "BDE") 返回 ['B'] 而不是 ['AD'] 【参考方案1】:

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

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

更多信息请参见re syntax。

【讨论】:

就在括号内?例如,“(?:A|B|C)”? @AntiEarth:是的,看例子 转义括号会导致索引吗?例如:r"\(这在括号中\)" 非转义括号具有特殊含义(字符类除外)。转义括号是一种表示您想要实际括号字符的方式。【参考方案2】:
re.findall(r"(?:A|B|C)D", "BDE")

re.findall(r"((?:A|B|C)D)", "BDE")

【讨论】:

以上是关于Python regex - 忽略括号作为索引?的主要内容,如果未能解决你的问题,请参考以下文章

python re模块findall()详解

python re模块findall()详解

忽略正则表达式搜索中的模式错误,不要使搜索崩溃

Python中匹配括号的索引

如何忽略为分组添加的项目

列表类型