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

时间:2018-04-19 22:07:23

标签: python regex

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

我的方法是使用itertools.permutations列出可以从给定字符串输入中生成的所有可能的字符串,然后使用正则表达式来匹配它们中的每一个。保证工作,但也指数复杂,导致我的wussy英特尔i5 w / 8gigs输入只有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

string =“123a213a321a” 打印(has_subpattern(字符串))

有关此方法的任何建议,以减少运行时间?我是一个新手,完全不知所措。

3 个答案:

答案 0 :(得分:0)

我认为你接近错了。如果它可以加扰,你真的只需要检查每个字符的数量是否相同。在javascript中,你可以这样做:

&#13;
&#13;
<input type="radio" ng-model="value" value="foo" ng-change='clearValue()'>
<input type="text" ng-model="name">
&#13;
&#13;
&#13;

对于python,只需按照相同的方法 - 计算每个字符出现的次数,看看每个字符是否具有相同的计数。

答案 1 :(得分:0)

dave帖子中反击方法的python是:

from collections import Counter

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

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

答案 2 :(得分:0)

在讨论了一些来自论坛的建议之后,我创建了一个使用计数器的解决方案,并且比粗暴强迫所有排列对正则表达式的价格低了几个数量级:

这就是我的意思:

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