混合正则表达式和shell通配符

时间:2010-09-14 06:07:22

标签: python regex wildcard

我有一个从配置文件中读取的python脚本。配置文件将包含一些用户定义的正则表达式模式。但是,我想我想让用户使用完整的正则表达式模式或OR shell通配符。所以我应该能够解释这两个

*.txt
以及
.*\.txt$
正确。所以那些2应该是等价的。

但是,我希望能够在不让用户告诉我他们正在使用的内容的情况下做到这一点。这甚至可能吗?也许允许完全正则表达式是过度的。

4 个答案:

答案 0 :(得分:2)

你不能这样做。 prefix.*应该匹配什么?那么somefiles?呢?这些在正则表达式与全局匹配中具有非常不同的含义,但在两者中都是常见的用例。

答案 1 :(得分:1)

一种可能的方法是:

  1. 尝试将给定表达式编译为正则表达式。

    一个。如果失败(语法错误),请将表达式用作glob字符串。

    湾如果编译失败,请将其用作正则表达式。

  2. 如果它与任何内容都不匹配,请将其用作全局字符串。

  3. 在任何情况下,告诉用户你做了什么(“将pattern.*解释为正则表达式”)并允许他覆盖你猜到的任何内容。毕竟,正如Zak Thompson写的那样,一些模式将是有效的正则表达式和glob模式。

    另一件需要考虑的事情是,用户可以通过catastrophic backtracking使用正则表达式轻松地使系统过载或崩溃。因此,除非它是您自己的用户自己的机器,否则您可能想要考虑首先允许正则表达式。

答案 2 :(得分:0)

例如,考虑模式

foo?.txt

在glob-syntax中,这将匹配foo1.txt,fooZ.txt但不匹配fo.txt,fob.txt或fooZtxt 在regexp syntaxt中,这将匹配fo.txt,foQtxt,但不匹配fooZ.txt

您无法明确地接受这两种语法。我能想到的唯一选择是使用用户前缀表达式,即

regexp:foo?.txt

答案 3 :(得分:0)

尽量不要将regex的创建留给用户。用户应该有一种更简单的方法来配置他们的文件,而无需使用正则表达式。例如,让用户有几个选择,

  1. 开头
  2. 结尾
  3. 包含(OR和AND)
  4. 然后作为程序员,您可以使用这些选项来构建正则表达式。