Python正则表达式错误:组名中的错误字符

时间:2017-03-25 12:25:37

标签: python regex

有人可以告诉我为什么这个正则表达式在oneline正则表达式网站上正常工作,但在python中使用re.compile()时却没有。

我使用过这个网站: https://regex101.com/和测试过的字符串是:

"test": "value"

Python代码

x = r'((?(?=")(?:"(?(?<=\\)(?:.)|(?:[^")]))+")|(?:\w+)))(:|~)\s+((?(?=")(?:"(?(?<=\\)(?:.)|(?:[^"]))+")|(?:\w+)))'
re.compile(x)

错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\re.py", line 190, in compile
    return _compile(pattern, flags)
  File "C:\Python27\lib\re.py", line 245, in _compile
    raise error, v # invalid expression
sre_constants.error: bad character in group name

2 个答案:

答案 0 :(得分:0)

如果你想要超越标准的能力,试试这个: https://bitbucket.org/mrabarnett/mrab-regex

它是re的替代品,但支持更多新功能,包括条件模式。

答案 1 :(得分:0)

从您的示例字符串和regex101输出中,您似乎正在尝试将Python字符串与常规形式进行匹配:

"word": "word"

也就是说,第1组和第3组是可以用双引号引起来的单词,也可以不加引号,但是用单引号引起来,第2组是冒号或代字号,可以跟随由空格字符组成。所以:

goodString = "\"test\": value"
badString = "test\": value"

您的正则表达式编译字符串的问题实际上暗示了解决方案! This question阐明了返回的错误,而Python documentation提供了有关命名组的信息。

通过使用命名组,可以使表达式更短,更Python化!

x = r'((?P<a>\"?)\w+(?P=a))(:|~)\s+((?P<b>\"?)\w+(?P=b))'

为清楚起见:

group 1 = ((?P<a>\"?)\w+(?P=a))
group 2 = (:|~)\s+
group 3 = ((?P<b>\"?)\w+(?P=b))

第1组和第3组捕获子组(分别为a和b)中是否存在引号,然后在单词末尾检查该子组。

您也无需命名组!您可以简单地引用他们的电话号码:

x = r'((\"?)\w+(\2))(:|~)\s+((\"?)\w+(\6))'

作为最终测试:

x = r'((\"?)\w+(\2))(:|~)\s+((\"?)\w+(\6))'
goodString = "\"test\": value"
badString = "test\": value"
print(re.match(x,goodString))
print(re.match(x,badString))

输出:

<_sre.SRE_Match object; span=(0, 13), match='"test": value'>
None