检查正则表达式的逻辑串联

时间:2013-11-04 07:58:56

标签: python regex

我在python中遇到以下问题,希望你能帮忙。

输入是2个正则表达式,我必须检查它们的串联是否可以有值。 例如,如果有人说使用长度大于10的字符串而另一个说最多5个字符串 没有值可以传递两个表达式。

python中有什么东西可以解决这个问题吗?

谢谢, 最大

3 个答案:

答案 0 :(得分:0)

  

python中有什么东西可以解决这个问题吗?

Python中没有任何内容可以直接解决这个问题。

也就是说,您可以使用前瞻断言来模拟两个正则表达式的逻辑和操作。对Regular Expressions: Is there an AND operator?

的示例有一个很好的解释

这将结合正则表达式,但不会直接显示是否存在满足组合正则表达式的某些字符串。

答案 1 :(得分:0)

从这里获取此强力算法: 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长度。你也可以实施许多其他小技巧。

答案 2 :(得分:0)

我非常怀疑这样的事情是如何实现的,甚至有一种方法可以有效地计算它。

现在我想到的一种近似方法是检测最明显的冲突,即生成符合每个正则表达式的随机字符串,然后检查正则表达式的连接是否与生成的字符串的串联相匹配。

类似的东西:

import re, rstr
s1 = rstr.xeger(r1)
s2 = rstr.xeger(r2)
print re.match(r1 + r2, s1 + s2)

虽然我无法想到让失败的方法。在我看来,对于你的例子,r1匹配超过10个字符的字符串,r2匹配短于5个字符的字符串,那么两者的总和将产生第一部分长于10的字符串和一个小于5的尾巴。