Python并没有正确地解释正则表达式

时间:2014-04-19 12:13:28

标签: python regex

我有这段代码:

import re

regex = re.compile("(.+?)\1+")
results = regex.findall("FFFFFFF")
print(results)

预期结果是:

['F']

根据regexpal,正则表达式正在做它应该做的事情(找到最短的重复子字符串)。但是在python the result is []中尝试正则表达式时。这是为什么?

3 个答案:

答案 0 :(得分:3)

尝试

regex = re.compile(r"(.+?)\1+")

为什么它不起作用?你可以通过

理解
print r"(.+?)\1+"
print "(.+?)\1+"

请参阅What does preceding a string literal with "r" mean?

答案 1 :(得分:3)

使用原始字符串:

>>> re.findall("(.+?)\1+", "FFFFFFF")
[]
>>> re.findall(r"(.+?)\1+", "FFFFFFF")
['F']
>>> 

原始字符串文字,即前缀为'r'的字符串文字,使反斜杠被视为文字。否则反斜杠被视为转义序列。

引自re — Regular expression operations

  

正则表达式使用反斜杠字符('\')来表示   特殊形式或允许使用特殊字符   唤起他们的特殊意义。 ...

     

解决方案是使用Python的常规字符串表示法   表达模式;反斜杠不以任何特殊方式处理   带有'r'前缀的字符串文字。所以r"\n"是一个双字符串   包含'\''n',而"\n"是一个单字符的字符串   包含换行符。通常模式将用Python表示   使用此原始字符串表示法的代码。

答案 2 :(得分:2)

使用原始字符串:

regex = re.compile(r"(.+?)\1+")

或逃避反斜杠:

regex = re.compile(r"(.+?)\\1+")