我在python中有以下问题,希望您能提供帮助。
输入是 2 个正则表达式,我必须检查它们的连接是否可以有值。例如,如果一个说接受长度大于 10 的字符串,而另一个说最多 5 个,那么任何值都不能同时传递这两个表达式。
python中有什么东西可以解决这个问题吗?
谢谢,马克斯。
python中有什么东西可以解决这个问题吗?
Python 中没有任何东西可以直接解决这个问题。
也就是说,您可以通过使用前瞻断言来模拟两个正则表达式的逻辑与操作。正则表达式中有一个很好的示例说明:Is there an AND operator?
这将组合正则表达式,但不会直接显示是否存在满足组合正则表达式的字符串。
从这里获取这个蛮力算法: Generating a list of values a regex COULD match in Python
def all_matching_strings(alphabet, max_length, regex1, regex2):
"""Find the list of all strings over 'alphabet' of length up to 'max_length' that match 'regex'"""
if max_length == 0: return
L = len(alphabet)
for N in range(1, max_length+1):
indices = [0]*N
for z in xrange(L**N):
r = ''.join(alphabet[i] for i in indices)
if regex1.match(r) and regex2.match(r):
yield(r)
i = 0
indices[i] += 1
while (i<N) and (indices[i]==L):
indices[i] = 0
i += 1
if i<N: indices[i] += 1
return
示例用法,对于您的情况(两个正则表达式)...您还需要将所有可能的符号/空格/等添加到该字母表中...:
alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
import re
regex1 = re.compile(regex1_str)
regex2 = re.compile(regex1_str)
for r in all_matching_strings(alphabet, 5, regex1, regex2):
print r
也就是说,运行时非常疯狂,你会想尽你所能来加速它。关于我从算法中刷出的答案的一个建议是过滤字母表,使其仅包含正则表达式“可能”的字符。因此,如果您扫描您的正则表达式并且您只看到 [1-3] 和 [a-eA-E],而没有“.”、“\w”、“\s”等,那么您可以减小字母为 13 长度。您还可以实施许多其他小技巧。
我非常怀疑这样的事情是否已实现,甚至是否有一种方法可以有效地计算它。
我现在想到的一种检测最明显冲突的近似方法是生成一个符合每个正则表达式的随机字符串,然后检查正则表达式的串联是否与生成的字符串的串联相匹配。
就像是:
import re, rstr
s1 = rstr.xeger(r1)
s2 = rstr.xeger(r2)
print re.match(r1 + r2, s1 + s2)
虽然我真的想不出办法让这个失败。在我看来,对于您的示例,其中r1
匹配超过 10 个字符的r2
字符串,匹配短于 5 个字符的字符串,那么两者的总和将产生第一部分长于 10 且尾部小于 5 的字符串。