Regex 列出所有可能性的正则表达式
给定正则表达式,如何列出所有可能的匹配项? 例如:AB[CD]1234,我希望它返回如下列表: ABC1234 ABD1234 我在网上搜索,但什么也没找到。不可能 真的Regex 列出所有可能性的正则表达式,regex,Regex,给定正则表达式,如何列出所有可能的匹配项? 例如: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'
——完全按照广告的方式工作。谢谢顺便说一句,它也可以下载,但是你也可以直接在浏览器中尝试,如果你需要一次性下载的话,这很方便。