正则表达式,用于将所有内容放在方括号之间,包括括号

时间:2020-10-27 14:22:29

标签: python regex

我有一个字符串,我正在尝试为其创建正则表达式,以便提取括号内的所有内容。这样的字符串的示例如下

[-At(A),+CarAt(B),-CarAt(A),-InCar]

我正在使用的当前正则表达式为re.search(r'\[.*?\]', string),但这只会返回-At(A),-InCar而不是-At(A),+CarAt(B),-CarAt(A),-InCar

我不确定为什么它与-At(A)中的一组括号匹配;我以为我可以使用正则表达式,因为它可以匹配方括号之间的所有内容。

如何将所有内容放在原始字符串的括号内?

2 个答案:

答案 0 :(得分:1)

我认为问题出在问号。因为问号,当它们后面有一个量词时,会使它们“懒惰”。 因此,请尝试使用:

r'\[.*\]'

答案 1 :(得分:0)

您没有说您想要被约束的成员,但我怀疑这是最终的情况

为此,我发现最好先切成薄片或用.strip()括起来,然后再.split()这种字符串来获得其成员,然后再进行进一步的验证

>>> s = "[-At(A),+CarAt(B),-CarAt(A),-InCar]"
>>> s = s.strip('[]')
>>> s
'-At(A),+CarAt(B),-CarAt(A),-InCar'
>>> values = s.split(',')
>>> values
['-At(A)', '+CarAt(B)', '-CarAt(A)', '-InCar']

通常使用正则表达式来验证其单个结果

  • 更容易写和解释
  • re.findall()更能突出显示不匹配项,后者会默默地忽略不匹配项
  • 与尝试在单个步骤(ex1 ex2)中进行操作相比,计算效率更高(尽管可能不适用于您的情况)
>>> import re
>>> RE_wanted = re.compile(r"[+-](At|Car|In){1,2}(\([A-Z]\))?")
>>> all((RE_wanted.match(a) for a in values))
True