【问题标题】:Determining input type for any regex确定任何正则表达式的输入类型
【发布时间】:2012-02-14 05:36:55
【问题描述】:

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

例如:

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

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

【问题讨论】:

  • 不清楚你的意思。生成器函数会是什么样子?
  • 如果你想测试正则表达式,从正则表达式生成预期的输入和输出难道不会完全破坏首先测试它们的意义吗?
  • 我有一个臃肿的 django 项目要修复,但不知道它的哪些部分有效。因为这是一个巨大的项目,在我看来,唯一的方法是通过根据 url 模式中的正则表达式动态生成 url 来测试视图。
  • @hinoglu:最好描述一下你的真实问题,而不是一些看起来可行的方法。您想生成与 Django URL 中的路径匹配的示例 URL?这是真正的问题吗?您可能想关闭它并提出 real 问题。 Django 的 reverse() 函数是您首先要阅读的内容,如果这是您的问题。

标签: python regex validation


【解决方案1】:

这个答案很好地抽象地定义了问题: 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 以生成其字符串。如果您在 . 后有字符要匹配的正则表达式,则将转换添加回状态。 em> 对于之后的每一个状态。对于 xeger 之后的每个状态,xeger 将变得越来越不可能达到接受状态。”

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

这是您会发现的所有实现中的共同主题。这些解决方案只适用于精心构造的表达式。否则,您的代码可能会进行无限的旅程,永远找不到您要寻找的东西。如果您需要的确实是常规且定义明确的,那么其中一种方法可能适合您。

【讨论】:

    【解决方案2】:

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

    Do all regular expressions halt?

    最重要的是,如果你有一个能生成一些晦涩难懂的、与任何正则表达式匹配的复杂文本的预言机,你会用它作为测试吗?你怎么知道给定的兆字节文本垃圾是否实际上是给定的正则表达式旨在匹配或应该匹配的内容?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-16
      • 2013-04-07
      • 1970-01-01
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      • 2019-07-13
      相关资源
      最近更新 更多