Regex 列出所有可能性的正则表达式

Regex 列出所有可能性的正则表达式,regex,Regex,给定正则表达式,如何列出所有可能的匹配项? 例如:AB[CD]1234,我希望它返回如下列表: ABC1234 ABD1234 我在网上搜索,但什么也没找到。不可能 真的 考虑前瞻性断言。那么关于*,您将如何生成与该正则表达式匹配的所有可能字符串呢?正则表达式只用于匹配模式,也就是说,正则表达式永远不会“列出”任何内容,只会匹配。如果你想得到所有匹配项的列表,我相信你需要自己去做。也许可以找到一些代码来列出所有可能的匹配项,就像你正在做的一样简单。但大多数正则表达式您甚至不想尝试列出所有可能的匹

给定正则表达式,如何列出所有可能的匹配项? 例如:AB[CD]1234,我希望它返回如下列表: ABC1234 ABD1234

我在网上搜索,但什么也没找到。

不可能

真的


考虑前瞻性断言。那么关于
*
,您将如何生成与该正则表达式匹配的所有可能字符串呢?

正则表达式只用于匹配模式,也就是说,正则表达式永远不会“列出”任何内容,只会匹配。如果你想得到所有匹配项的列表,我相信你需要自己去做。

也许可以找到一些代码来列出所有可能的匹配项,就像你正在做的一样简单。但大多数正则表达式您甚至不想尝试列出所有可能的匹配项


例如,AB.*1234将是AB,后跟绝对的任何东西,然后是1234。

我甚至不完全确定这是否可能,但如果可能的话,在许多情况下,这将是cpu/时间密集型的,因此它将没有用

例如,尝试为*Z创建一个所有匹配项的列表

有一些网站可以帮助构建良好的正则表达式:


    • 您没有找到任何东西的原因可能是,考虑到某些表达式允许的组合数量,这是一个非常复杂的问题。某些正则表达式甚至可以允许infite匹配:

      考虑以下表达式:

      AB[A-Z0-9]{1,10}1234
      
      AB.*1234
      

      我认为你最好的选择是根据一小部分允许的模式自己创建一个算法。在您的特定情况下,我建议使用比正则表达式更简单的方法。

      您可以将正则表达式转换为等效的有限状态机(相对简单,可以通过算法完成),然后递归地遍历通过该fsm的每一条可能路径,通过机器输出跟随路径。这既不是很难,也不是计算机密集型的每输出(你通常会得到大量的输出然而)。但是,您应该注意禁止可能无限的传递(如
      *
      )。这可以通过设置允许的最大路径长度来实现,然后中止跟踪

      对于一些简单的正则表达式,如您提供的(AB[CD]1234),有一组有限的匹配项。但对于其他表达式(AB[CD]*1234),可能匹配的数量不受限制

      定位所有可能性的一种方法是检测正则表达式中的何处有选择。对于每个可能的选择,基于原始正则表达式和当前选择生成一个新的正则表达式。这个新的正则表达式现在比原来的要简单一些

      对于像“A[BC][DE]F”这样的表达式,该方法将如下进行

      getAllMatches("A[BC][DE]F")
      = getAllMatches("AB[DE]F") + getAllMatches("AC[DE]F")
      = getAllMatches("ABDF") + getAllMatches("ABEF") 
         + getAllMatches("ACDF")+ getAllMatches("ACEF")
      = "ABDF" + "ABEF" + "ACDF" + "ACEF"
      

      可以编写一个算法来实现这一点,但它只适用于具有有限可能匹配集的正则表达式。您的正则表达式将仅限于使用:

      • 可选:
      • 字符:\d\d
      • 集合:像[1a-c]
      • 否定集:[^2-9d-z]
      • 备选方案:|
      • 正面环视
      因此您的正则表达式无法使用:

      • 中继器:*+
      • 字模式:\w\w
      • 消极环视
      • 一些零宽度断言:^$
      还有一些其他的(单词边界,懒惰和贪婪的量词),我还不确定

      至于算法本身,另一个用户发布了一个链接,其中描述了如何创建算法。

      可以这样做:

      $ python exrex.py 'AB[CD]1234'
      ABC1234
      ABD1234
      

      因为我有一个需要组合车牌的应用程序。某些角色有多种可能性。就像上面的例子,我敢打赌这个问题是NP难的。不愿意花时间在证明上:你的意思是所有可能匹配的PA列表。对于任何给定的正则表达式都是不可能的,但是如果你删除一些正则表达式的特性,例如可变的重复次数(例如,
      *
      +
      ,等等),那么肯定是可能的。。。尽管如此,即使有这些限制,这仍然是一个困难但有趣的问题。可以检测到无限的可能性,并将其作为错误显示给用户。最后是一个实际的答案!使用
      pip安装测试了这一点——用户exrex
      ,然后使用
      exrex'AB[CD]1234'
      ——完全按照广告的方式工作。谢谢顺便说一句,它也可以下载,但是你也可以直接在浏览器中尝试,如果你需要一次性下载的话,这很方便。