如何将变量添加到我的 re.compile 表达式中

Posted

技术标签:

【中文标题】如何将变量添加到我的 re.compile 表达式中【英文标题】:How to add a variable into my re.compile expression 【发布时间】:2014-08-29 13:09:45 【问题描述】:

所以我试图在文件中查找由变量what2look4 表示的关键字。每当我运行该程序时,它都会不断返回空白数据。代码如下:

regex2=re.compile(".*(what2look4).*")

我认为问题在于正在搜索文件 what2look4 作为其本身的字符串,而不是该变量所代表的内容。如有错误请指正,谢谢帮助。

【问题讨论】:

在编译之前,正则表达式是一个与其他字符串没有区别的字符串。如何将变量的值放入任意字符串? 【参考方案1】:

你可以这样做......

>>> regex2 = re.compile('.*(%s).*'%what2look4)

或者你可以使用format:

>>> regex2 = re.compile('.*().*'.format(what2look4))

【讨论】:

这种字符串格式化方法考虑“旧”。见这里:docs.python.org/2/library/string.html#format-examples @MartinKonecny:Python 3.4 中仍然支持使用 % 运算符的 Python 所谓的 old printf 样式格式,并且没有被弃用的迹象。使用元组解包来构建字符串完全没有问题。在这种特殊情况下,对于正则表达式,.format 方法更直观。 +1 表示两种解决方案。起初我想如果我们只是在寻找文字,为什么我们需要两边都有.*?但这使它变成了一种 gr​​ep,返回行 - 可能是意图。 你将如何扩展这两个变量?【参考方案2】:

使用String format:

search = "whattolookfor"
regex2=re.compile(".*().*".format(search))

字符串中的将被替换为whattolookfor

【讨论】:

您如何处理将 作为正则表达式一部分的正则表达式?【参考方案3】:

如果您不小心,上面的答案可能会给您带来麻烦。在大多数情况下,您需要使用re.escape() 来转义出现在您尝试插入的字符串变量中的任何可能的正则表达式元字符。此外,f 字符串和.format() 方法都需要使用花括号 ,它们本身就是正则表达式元字符。至少,如果您尝试将两者混合使用,您的 linter 会出现问题。

虽然它更难看,但我建议使用字符串添加来构建正则表达式模式。在这种情况下,这是最清晰、最不容易出错的方法。 printf 样式在 Python 中应该可以正常工作,但我个人不推荐它,因为“%”符号是 SQL 中的通配符,我发现在正则表达式中看到它会令人困惑。

考虑下面的示例,我们正在寻找可以在任何文件夹中并且我们希望以日期结尾的文件名。

# Note that "\d" is a regular expression metacharacter!
file_name_var = "\data"

# Option 1: string addition
re.compile(r'^.*' + re.escape(file_name_var ) + r'_\d4-\d2-\d2.csv$')

# Option 2: printf style
re.compile(r'^.*%s_\d4-\d2-\d2.csv$' % re.escape(file_name_var ))

【讨论】:

以上是关于如何将变量添加到我的 re.compile 表达式中的主要内容,如果未能解决你的问题,请参考以下文章

python 正则表达式 re,compile速度慢 ,怎样可以使的re.compile的速度更快

python 中的 re.compile 函数(转)

python中re.compile函数的使用

python中re模块的compile函数应该怎么用?

如何将项目列表转换为python中的变量?

如何将变量添加到我的 Perl 单行中?