查找字符串中的字符序列

时间:2019-02-19 14:13:12

标签: python string character string-length

我正在使用python,通过指定此字符链的长度来查找字符串中的任何字符序列。

例如,如果我们具有以下变量,我想提取长度为5的任何相同字符序列:

x = "jhg**11111**jjhgj**11111**klhhkjh111ljhjkh1111"

结果应该是:

11111
11111

我该怎么做?

6 个答案:

答案 0 :(得分:3)

animation: shoot-bullet 150ms linear 0, shoot-bullet 200ms linear 150ms, shoot-bullet 250ms linear 350ms, ...; 进行营救:)

itertools

编辑:命名正确

>>> import itertools
>>> val = 5
>>> x
'jhg**11111**jjhgj**11111**klhhkjh111ljhjkh1111'
>>> [y[0]*val for y in itertools.groupby(x) if len(list(y[1])) == val]
['11111', '11111']

或者@Chris_Rands建议使用内存效率更高的oneliner

>>> [char*val for char,grouper in itertools.groupby(x) if len(list(grouper)) == val]
['11111', '11111']

答案 1 :(得分:2)

或者,如果您可以使用正则表达式,则可以使代码更简洁:

[row[0] for row in re.findall(r'((.)\2{4,})', s)]

regex101 - example

答案 2 :(得分:1)

下面的原始答案用于一个不同的问题(标识字符串中n个字符的重复模式)。这是解决问题的一种可能方法:

x = "jhg**11111**jjhgj**11111**klhhkjh111ljhjkh1111"
n = 5
res = [x[i:i + n] for i, c in enumerate(x) if x[i:i + n] == c * n]
print(res)
# ['11111', '11111']

原始答案(错误)

使用Counter

from collections import Counter

x = "jhg**11111**jjhgj**11111**klhhkjh111ljhjkh1111"
n = 5
c = Counter(x[i:i + n] for i in range(len(x) - n + 1))
for k, v in c.items():
    if v > 1:
        print(*([k] * v), sep='\n')

输出:

**111
**111
*1111
*1111
11111
11111
1111*
1111*
111**
111**

答案 3 :(得分:1)

非常难看的解决方案:-)

<ace:chart id="memoryChart"
     animated="false"
     value="#{chartColorBean.fillData}"
     xAxis="#{chartColorBean.xAxis}"
     yAxes="#{chartColorBean.yAxes}"
     stackSeries="true"
     defaultSeriesColors="#{chartColorBean.customDefaultColor}"
     legend="#{chartColorBean.legend}"
     legendPlacement="INSIDE_GRID"
     highlighter="true"
     highlighterLocation="N"
     highlighterShowMarker="false"
     highlighterBringSeriesToFront="true"/>

答案 4 :(得分:0)

尝试一下:

x = "jhg**11111**jjhgj**11111**klhhkjh111ljhjkh1111"

seq_length = 5

for item in set(x):
    if seq_length*item in x:
        for i in range(x.count(seq_length*item)):
            print(seq_length*item)

它可以通过利用set()来轻松构建您要查找的序列,然后在文本中进行搜索

输出您想要的输出:

11111
11111

答案 5 :(得分:0)

我们稍微更改一下您的源字符串:

x = "jhg**11111**jjhgj**22222**klhhkjh33333jhjkh44444"

正则表达式应为:

pat = r'(.)\1{4}'

这里有一个捕获组(一个字符)和一个反向引用 (4次),因此完全相同的字符必须出现5次。

一种打印结果的变体,虽然不太直观:

res = re.findall(pat, x)
print(res)

但是上面的代码会打印:

['1', '2', '3', '4']

即列表,其中每个职位仅是捕获组(在我们的示例中 第一字符),而不是整个匹配项。

因此,我还提出了第二种变体,finditer和 同时打印开始位置和整个匹配项:

for match in re.finditer(pat, x):
    print('{:2d}: {}'.format(match.start(), match.group()))

对于以上数据,结果为:

 5: 11111
19: 22222
33: 33333
43: 44444