Python3-生成匹配多个正则表达式的字符串,而无需修改它们

时间:2018-12-04 10:56:24

标签: python regex

我想使用Python 3生成与我的正则表达式匹配的字符串。为此,我正在使用名为rstr的便捷库。

我的正则表达式:

  • ^[abc]+.
  • [a-z]+

我的任务:

我必须找到一种通用的方法,即如何创建与我的两个正则表达式都匹配的字符串。

我不能做什么:

修改两个正则表达式或以任何方式加入它们。我认为这是无效的解决方案,尤其是在不兼容的正则表达式的情况下:

import re
import rstr

regex1 = re.compile(r'^[abc]+.')
regex2 = re.compile(r'[a-z]+')

for index in range(0, 1000):
  generated_string = rstr.xeger(regex1)
  if re.fullmatch(regex2, generated_string):
    break;
else:
  raise Exception('Regexes are probably incompatibile.')

print('String matching both regexes is: {}'.format(generated_string))

是否有任何解决方法或任何神奇的库可以解决此问题?任何见解都很感激。

看似相似但无济于事的问题:

Asker 已经有字符串,他只是想以最优雅的方式针对多个正则表达式进行检查。就我而言,我们需要以一种与正则表达式匹配的聪明方式生成字符串。

3 个答案:

答案 0 :(得分:1)

如果您要使用通用方法,就不能真正使用蛮力方法。

您要寻找的是创建某种形式的regexp(就像rstr通过调用sre_parse.py所做的那样),然后调用一些SMT求解器来满足这两个条件。

对于Haskell,有https://github.com/audreyt/regex-genex使用Yices SMT求解器来做到这一点,但是我怀疑Python是否有类似的东西。如果我是你,我会咬一口子弹,然后从您的python程序中将其称为外部程序。

答案 1 :(得分:0)

我不知道是否有什么东西可以满足您的需求。 但我会做类似的事情(就像您已经做过的那样):

  1. 使用re.compile()函数创建一个Regex对象。
  2. 基于第一个正则表达式生成字符串。
  3. 使用search()方法将您拥有的字符串传递到第二个regex对象中。
  4. 如果通过...完成,则字符串通过两个正则表达式。

也许您可以创建一个函数并将两个正则表达式作为参数传递,并使用相同的逻辑测试“ 2 by 2”。

然后如果您要匹配8个正则表达式... 只要做:

call (regex1, regex2)
call (regex2, regex3)
call (regex4, regex5)
...

答案 2 :(得分:0)

我使用一些替代方法解决了这个问题。请注意,第二个正则表达式基本上是保险,因此在我们的新字符串中仅生成小写字母。

我使用了Google的python软件包sre_yield,该软件包允许字符集限制。软件包也可以在PyPi上使用。我的代码:

import sre_yield
import string

sre_yield.AllStrings(r'^[abc]+.', charset=string.ascii_lowercase)[0]
# returns `aa`