Python正则表达式:将re模式格式与变量结合

11 投票
5 回答
29406 浏览
提问于 2025-04-17 09:12

我想把一个Python变量和一个模式结合在一起。请问我该怎么做呢?

下面是我想要实现的内容。

re.search(r'**some_variable+pattern**',str_for_pattern_match,flags)

谢谢你的帮助。

5 个回答

6

在把字符串放进正则表达式的模式里时,你得小心。

这是因为这个字符串可能包含一些特殊的正则表达式字符,这些字符可能会导致错误或者让结果变得意外。

举个例子:

>>> import re
>>> s = 'one*two*three*four*five'
>>> t = '*f'
>>> r = re.compile(r'%s\w+' % t)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/re.py", line 190, in compile
    return _compile(pattern, flags)
  File "/usr/lib/python2.7/re.py", line 244, in _compile
    raise error, v # invalid expression
sre_constants.error: nothing to repeat

这个例子会失败,因为插入的字符串里有一个*,它是个特殊的正则表达式字符。

不过,这个问题可以通过对插入的字符串使用re.escape函数来解决:

>>> r = re.compile(r'%s\w+' % re.escape(t))
>>> r.findall(s)
['*four', '*five']
7

正则表达式的模式其实并不是Python特别对待的东西。它只是一个普通的字符串,re模块会把它当作模式来理解。

所以问题不是“我怎么在模式中使用变量?”,而是“我怎么根据变量构造一个字符串?”

Python的文档里有很多关于如何做到这一点的信息。特别有用的是关于字符串方法的说明。对于构造正则表达式来说,最重要的可能就是str.format(在eumiro的回答中有演示),它有一大部分内容专门讲解如何把基本数据类型格式化成你想要的模板字符串。

如果你能掌握字符串的基本操作,那么把变量放进正则表达式里就只是你能做的事情中的一小部分了!

16

通常的字符串格式化方法效果很好

re.search(r'**%s+pattern**' % some_variable, str_for_pattern_match, flags)

撰写回答