Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 蛮力正则表达式字符串匹配_Python_Regex - Fatal编程技术网

Python 蛮力正则表达式字符串匹配

Python 蛮力正则表达式字符串匹配,python,regex,Python,Regex,经过很多努力,我让这个程序开始工作,至少在我测试它的几个测试用例中是这样。这是我从CodeWars那里得到的一个挑战,任务是制作一个程序,它接受一个输入字符串(按顺序,或加扰),并返回一个布尔值,无论该输入是否由重复的子字符串组成 我的方法是使用itertools.permutations列出从给定字符串输入可以生成的所有可能字符串,然后使用正则表达式匹配其中的每一个字符串。保证可以工作,但复杂度也是指数级的,这会导致我的wussy Intel i5 w/8Gig上出现内存错误,输入只有3个唯一

经过很多努力,我让这个程序开始工作,至少在我测试它的几个测试用例中是这样。这是我从CodeWars那里得到的一个挑战,任务是制作一个程序,它接受一个输入字符串(按顺序,或加扰),并返回一个布尔值,无论该输入是否由重复的子字符串组成

我的方法是使用itertools.permutations列出从给定字符串输入可以生成的所有可能字符串,然后使用正则表达式匹配其中的每一个字符串。保证可以工作,但复杂度也是指数级的,这会导致我的wussy Intel i5 w/8Gig上出现内存错误,输入只有3个唯一字符len()==12

必须有一种更有效的方法来运行它(在Python中,最好是在Pypy/C扩展中运行它,这超出了本任务的范围)

足够多的序言,以下是我的代码:

def has_subpattern(string):
'''input: a string. Output: boolean: whether the input str is made of a
   smaller repeating substring. '''

import re
from itertools import permutations

if len(string) <= 1:
    return False

# check if the input has a repeating subpattern (in case it's not    scrambled)
if bool( re.match(r'(.+?)\1+$', string)) == True:
    return True

# create a set of the permutation of a string ( to remove duplicates)
perms = set([''.join(p) for p in permutations(string)])

pattern = re.compile(r'(.+?)\1+$')


print('# of permutations: ', len(perms))
print(perms)

# iterate through the list of permutations, checking if any has  #subpattern
for perm in perms:
    if bool((re.match(pattern, perm))) == True:
        print((re.match(pattern, perm)), perm)
        return True
return False
def具有_子模式(字符串):
''输入:一个字符串。输出:布尔值:输入str是否由
更小的重复子串。“”
进口稀土
从itertools导入置换

如果len(string)我想你是走错路了。如果可以对其进行置乱,则只需检查每个字符的计数是否相同。在javascript中,您可以执行以下操作:

函数isRepeating(str){
变量字符=str.split(“”);
如果(characters.length<2){返回false;}
var characterCounts=字符数.reduce(函数(进位,字符){
进位[字符]=进位[字符]?进位[字符]+1:1;
返运;
}, {});
变量计数=对象值(characterCounts);
return!counts.some(c=>c!==counts[0]);
}
console.log(isRepeating(“123a123a321a”);//真的
console.log(isRepeating(“hello”);//假的
console.log(isRepeating(“赛车”);//假的

console.log(isRepeating(“raceecar”);//真的
dave的文章中,计数器方法的python是:

from collections import Counter

c = Counter(string)
print(set(c.most_common().values()) == 1)

其思想是对所有字符进行计数,然后通过在计数器中获取一组值来检查计数是否相同。如果集合中只有一个数字,则所有字符都具有相同的计数,并且都是加扰的子字符串。

在与计数器进行了一些讨价还价后,根据论坛的建议,我创建了一个使用计数器的解决方案,其成本比对正则表达式强制执行所有排列要低几个数量级:

以下是我得到的:


测试用例示例:这看起来确实比我处理问题的方式要有效得多。谢谢这对规范有意义吗?根据您的描述,不清楚像“12311”这样的大小写是否返回True,因为字符串由“1111”、“22”、“33”组成,它们都是重复的。如果是这种情况,使用相同的策略,只需检查计数器中的所有值是否大于1。。。如果有效,请投票或接受。Cheers通过或未通过的字符串示例:#有#子模式(“a”)==False#没有重复的较短子模式,只有一个字符#有#子模式(“aaaa”)==True#只有一个字符重复#有#子模式(“abcd”)==False#没有重复#有#子模式(“babababababababa”)==True#重复的#有#子模式(“bbabbaabaabb”)==True#与上面相同,只是混洗了一下# def has_subpattern(string): ''' input: a string, output: boolean, whether the input is composed of a repeating substring ''' from collections import Counter

c = Counter(string)
if 1 in c.values():
    return False

return len(set(c.values())) == 1