如何在Python的正则表达式搜索函数中使用变量而不是字符串?

3
我有这个正则函数用于从字符串中提取特定的单词。
fileName = re.search(r'path1\w([A-Za-z\d]+)', self.fileList[0]).group(1)

path1 是一个实际的字符串。

如果我想用变量 fileName = "path1" 来替换它,该怎么办?

我尝试了:

print re.search(r'\w([A-Za-z\d]+)' % fileName, self.fileList[0]).group(1)

我遇到了这个错误:

类型错误:在字符串格式化期间并非所有参数都被转换

为什么会出现这个错误?如何解决这个问题?

2个回答

3

你需要在正则表达式中使用%s

print re.search(r'%s\w([A-Za-z\d]+)' % fileName, self.fileList[0]).group(1)

或者更加Pythonic和灵活的方式是使用str.format函数:

print re.search(r'{}\w([A-Za-z\d]+)'.format(fileName), self.fileList[0]).group(1)

请注意,如果您有一个文件名列表,可以循环遍历它们并将文件名传递给format来实现第二种方式。

0
在像正则表达式这样的语言中插值字符串时,应该非常小心。在这种情况下,您应该先转义字符串:
expression = r'{}\w([A-Za-z\d]+)'.format(re.escape(fileName))
re.search(expression, self.fileList[0]).group(1)

也许值得注意的是正则表达式的命名列表:

import regex

expression = regex.compile(r'\L<filename>\w([A-Za-z\d]+)', filename=[fileName])
expression.search(self.fileList[0]).group(1)

这样可以避免对字面进行正则表达式转义,并且如果有多个选项,它的效果更好。 (此外,regex本来就更好,所以更应该使用它!)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接