任何人都可以帮助我理解为什么这样有效......
z = re.findall(r'(foobar)', string)
但这不是吗?
regexStr = "r'(foobar)'"
z = re.findall(regexStr, string)
我已经打印了regexStr并确定它的输出是IDENTICAL到r'(foobar)'。
有人可以帮忙吗?我也试过逃避撇号。
JD
答案 0 :(得分:3)
字符串上的“r”修饰符应在引号之外
regexStr = r'(foobar)'
从docs - “字符串文字可以选择以字母'r'或'R'为前缀;这样的字符串称为原始字符串,并使用不同的规则来解释反斜杠转义序列。”
答案 1 :(得分:0)
您的问题的解决方案是
regexStr = r'(%s)' % searchString
其中searchString将替换%s
在Python中,使用此构造通常比常规连接更好。 (意思是str1 + str2 + ...) 特别是因为你不必关心转换双打等等。
有关此主题的更多信息,请访问:3.5. Formatting Strings
r不应该是字符串的一部分,它只告诉python解释器它是什么类型的字符串:
r('hello\n') # Raw string => (hello\n)
u'unicodestring'
答案 2 :(得分:0)
r
修饰符构建原始字符串。它告诉Python不要将反斜杠转义序列转换为特殊字符,例如\t
或\n
,用于内置字符串。它与正则表达式转义序列无关。
>>> len('\t') # tab character only
1
>>> len(r'\t') # backslach character followed by a tee
2
但是,正则表达式语法有自己的一组转义规则,这些规则经常与内置Python字符串的转义规则发生冲突。 r
关键字有助于我们只处理一个关键字。例如,下面的第一个字符串是与单词字符匹配的正则表达式文本,因此是第二个字符串,因为Python会将\\
转换为内置字符串的\
,除非提供r
关键字
>>> re.compile(r'\w') == re.compile('\\w')
True
在您的情况下,r'(foobar)'
完全等同于'(foobar)'
,因为没有反斜杠序列可以转义。此字符串仅在您的脑海中是正则表达式 text 。 r
关键字不会告诉Python以这种方式解释字符串。 Python只知道使用re.compile()
构建的正则表达式 objects ,或者使用re.findall()
等方法进行编译。
编译正则表达式对象有一组与内置字符串转义序列规则不同的规则,而正则表达式规则与r
关键字无关。正则表达式编译器不理解它的特殊含义,只有Python解释器才能理解。
在您的情况下,r
中的"r'(foobar)'"
关键字没有特殊处理,因为它直接传递给正则表达式编译器。您正在有效地构建一个正则表达式,用于搜索以"
开头的字符串,然后搜索r
,依此类推。这就是两个表达方式不同的原因。
>>> re.compile(r'(foobar)') == re.compile('"r(foobar)"') # your expressions
False
r
关键字的使用在此处无效:
>>> re.compile(r'(foobar)') == re.compile('(foobar)')
True
>>> re.compile(r'"r(foobar)"') == re.compile('"r(foobar)"')
True
了解更多信息: