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

pra*_*ddy 9 python regex

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

以下是我想做的事情.

re.search(r'**some_variable+pattern**',str_for_pattern_match,flags)
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

lig*_*lig 16

通常的字符串格式化方式很有效

re.search(r'**%s+pattern**' % some_variable, str_for_pattern_match, flags)
Run Code Online (Sandbox Code Playgroud)


eum*_*iro 5

re.search(r'**{0}+pattern**'.format(variable_name), str_for_pattern_match, flags)
Run Code Online (Sandbox Code Playgroud)

现在,您的所有内容都{…}将被解释为字符串格式的占位符。

  • 不过,需要注意的一件事是:如果变量具有特殊的元字符,则将按原样使用它们。如果不需要,则可能要用'\ Q`和`\ E`包围占位符:`r'\ Q {0} \ E' (3认同)

Ben*_*Ben 5

正则表达式模式不是Python特别关注的一些额外的东西.模式只是一个完全普通的字符串值,re模块将其解释为模式.

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

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

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


ekh*_*oro 5

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

这是因为字符串可能包含特殊的正​​则表达式字符,这可能导致错误或产生意外结果.

举个例子:

>>> 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
Run Code Online (Sandbox Code Playgroud)

这会失败,因为插入的字符串包含*,这是一个特殊的正则表达式字符.

但是,可以通过使用re.escape插入的字符串上的函数来解决此问题:

>>> r = re.compile(r'%s\w+' % re.escape(t))
>>> r.findall(s)
['*four', '*five']
Run Code Online (Sandbox Code Playgroud)