确定任何正则表达式的输入类型

时间:2012-01-19 14:52:36

标签: python regex validation

我有一长串应该测试的正则表达式。而不是逐个遍历列表并为每个表达式编写适用的测试 - 如果可能 - 我想创建一个生成器函数,它将考虑正则表达式的类型并生成相关的输入字符串。

例如:

rgx = re.compile(r'^item_(?P<item_number>\d+)$')

是否可以确定正则表达式匹配的输入类型?考虑到上面的例子,是否可以从编译的正则表达式中确定正则表达式所需的输入(例如item_23​​567)?

2 个答案:

答案 0 :(得分:0)

这个答案很好地抽象地定义了问题: https://stackoverflow.com/a/208112/1092724

Python解决方案: Reversing a regular expression in Python

Java库解决方案: http://code.google.com/p/xeger/

这些解决方案并非没有限制:请参阅http://code.google.com/p/xeger/wiki/XegerLimitations

从Xeger限制页面上的评论中提取

  
    

“值得注意的是,xeger的当前实现随机遍历fsm以生成其字符串。如果在。之后有正则表达式与字符匹配,则将转换添加回状态。对于之后的每一个州,在每个州之后变得越来越不可能。* xeger将会达到接受状态。“

  

(@ Highly Irregular)在评论中表达了类似的担忧。

这是您将找到的所有实现中的常见主题。解决方案只适用于精心构造的表达式。否则你的代码可能会继续无限的旅程,永远不会找到你想要的东西。如果你需要的是确实经常和明确的定义,这些方法之一可能适合你。

答案 1 :(得分:0)

对于扩展的正则表达式,一般意义上是不可能的,参见例如

Do all regular expressions halt?

最重要的是,如果你有一个oracle生成了一些与任何正则表达式匹配的模糊,复杂的文本,你会用它作为测试吗?你怎么能知道给定的文本垃圾是否真的是给定的正则表达式设计匹配或应该匹配?