我有这段代码:
import re
regex = re.compile("(.+?)\1+")
results = regex.findall("FFFFFFF")
print(results)
预期结果是:
['F']
根据regexpal,正则表达式正在做它应该做的事情(找到最短的重复子字符串)。但是在python the result is []
中尝试正则表达式时。这是为什么?
答案 0 :(得分:3)
尝试
regex = re.compile(r"(.+?)\1+")
为什么它不起作用?你可以通过
理解print r"(.+?)\1+"
print "(.+?)\1+"
答案 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+")