我在python中遇到以下问题,希望你能帮忙。
输入是2个正则表达式,我必须检查它们的串联是否可以有值。 例如,如果有人说使用长度大于10的字符串而另一个说最多5个字符串 没有值可以传递两个表达式。
python中有什么东西可以解决这个问题吗?
谢谢, 最大
答案 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的尾巴。