如何从python中的字符串中找到连续的子串

时间:2017-01-28 05:57:29

标签: python python-3.x

我有一个字符串python manage.py runserver 168.62.208.14:8000

我需要找到如下的子串: a,b,c,cc​​,d,dd,ddd,e

子字符串abccdddeab无效。

我尝试从字符串中查找所有子字符串,但效率不高

cd

这是输出:

def get_all_substrings(input_string): length = len(input_string) return [input_string[i:j+1] for i in range(length) for j in range(i,length)]

这是我找到子串的方法,但它给出了所有可能性,但这就是它效率低下的原因 请帮助!

6 个答案:

答案 0 :(得分:3)

您可以使用itertools.groupby()

from itertools import groupby

s = 'abccdddcce'
l1 = ["".join(g) for k, g in groupby(s)]
l2 = [a[:i+1] for a in l1 for i in range(len(a))]
print l2

输出:

['a', 'b', 'c', 'cc', 'd', 'dd', 'ddd', 'c', 'cc', 'e']

答案 1 :(得分:1)

itertools.groupby可以告诉您连续字符的数量。在此之后,每个组都会重复使用该字符。

from itertools import groupby

def substrings(s):
    for char, group in groupby(s):
        substr = ''
        for i in group:
            substr += i
            yield substr

for result in substrings('abccdddcce'):
    print(result)

答案 2 :(得分:0)

您可以使用collections.Counter()

from collections import Counter
L = []
s = 'abccddde'
c = Counter(s) # Counter({'d': 3, 'c': 2, 'a': 1, 'b': 1, 'e': 1})
for k, v in c.items():
    for x in range(1, v+1):
        L.append(x*k)

Counter(s)返回一个字典,其中包含字母在字符串中重复的次数。然后我们遍历字典并为一个术语创建所有重复的字符串(' d',' dd' ddd'等)。

答案 3 :(得分:0)

这是使用正则表达式的一种方式:

In [85]: [j for i in re.findall(r'((\w)(\2+)?)', s) for j in set(i) if j]
Out[85]: ['a', 'b', 'c', 'cc', 'ddd', 'dd', 'd', 'e']

答案 4 :(得分:0)

以下将做你想要的。我不知道它与其他解决方案相比是否有效。

def get_all_substrings(text):
    res = []
    prev = ''
    s = ''

    for c in text:
        if c == prev:
            s += c
        else:
            s = prev = c
        res.append(s)

    return res

# Output
>>> get_all_substrings('abccddde')
['a', 'b', 'c', 'cc', 'd', 'dd', 'ddd', 'e']
>>> get_all_substrings('abccdddec')
['a', 'b', 'c', 'cc', 'd', 'dd', 'ddd', 'e', 'c']

计时

import timeit
import random

size = 100
values = 'abcde'
s = ''.join(random.choice(values) for _ in range(size))

print(s)

print(timeit.timeit("get_all_substrings(s)",
                    setup = 'from __main__ import s, get_all_substrings',
                    number = 10000) )

# Example for size 100 input
abbaaebacddbdedbdbbacadcdddabaeabacdcbeebbccaadebdcecadcecceececcacebacecbbccdedddddabaeeceeeccabdcc
0.16761969871275967

答案 5 :(得分:0)

<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/pdf "access plus 1 month"
ExpiresByType text/x-javascript "access plus 1 month"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 year"
ExpiresDefault "access plus 2 days"
</IfModule>