无法将值传递给re.findall(python)

时间:2011-06-26 08:11:03

标签: python

任何人都可以帮助我理解为什么这样有效......

z = re.findall(r'(foobar)', string)

但这不是吗?

regexStr = "r'(foobar)'"
z = re.findall(regexStr, string)

我已经打印了regexStr并确定它的输出是IDENTICAL到r'(foobar)'。

有人可以帮忙吗?我也试过逃避撇号。

JD

3 个答案:

答案 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

了解更多信息: