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

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

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

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

【问题讨论】:

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

标签: python regex variables python-2.7


【解决方案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'_\d{4}-\d{2}-\d{2}.csv$')

# Option 2: printf style
re.compile(r'^.*%s_\d{4}-\d{2}-\d{2}.csv$' % re.escape(file_name_var ))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 2015-08-02
    • 2014-07-28
    • 2015-05-13
    • 1970-01-01
    • 2013-06-30
    相关资源
    最近更新 更多