Python正则表达式:将重新模式格式与变量相结合

时间:2011-12-29 11:45:37

标签: python regex

我想结合一个python变量和模式。我该怎么办?

以下是我想做的事。

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

感谢您的帮助。

5 个答案:

答案 0 :(得分:16)

通常的字符串格式化方式很好用

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

答案 1 :(得分:5)

正则表达式模式不是Python专门处理的一些特殊的东西。模式只是一个完全普通的字符串值,re模块将其解释为模式。

所以问题不是“如何在模式中使用变量?”而是“如何根据变量构造字符串?”。

Python文档有很多关于如何执行此操作的信息。特别有用的是string methods上的文档。其中最重要的是构造正则表达式可能是str.format(如eumiro的回答所示),其中a large section of its own描述了如何将基本数据类型格式化为几乎任何模板字符串你想要的方式。

如果你可以掌握字符串的基本操作,那么将变量粘贴到正则表达式中将是你能做的最少的事情!

答案 2 :(得分:5)

将字符串插入正则表达式时必须小心。

这是因为字符串可能包含special regexp characters,这可能导致错误或产生意外结果。

举个例子:

>>> 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']

答案 3 :(得分:4)

re.search(r'**{0}+pattern**'.format(variable_name), str_for_pattern_match, flags)

现在,您的所有{…}都将被解释为string format占位符。

答案 4 :(得分:0)

使用Python的f-string语法的更新(可能是所有语法中最简单的):

re.search(rf'**{some_variable}pattern**',str_for_pattern_match,flags)