我正在使用python,通过指定此字符链的长度来查找字符串中的任何字符序列。
例如,如果我们具有以下变量,我想提取长度为5的任何相同字符序列:
x = "jhg**11111**jjhgj**11111**klhhkjh111ljhjkh1111"
结果应该是:
11111
11111
我该怎么做?
答案 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)
答案 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