我有像"aaaaabbbbbbbbbbbbbbccccccccccc"
. 字符的数量可能不同,有时字符串内可能会有破折号,例如"aaaaa-bbbbbbbbbbbbbbccccccccccc"
.
有没有什么聪明的方法可以拆分它"aaaaa"
,获取它的索引"bbbbbbbbbbbbbb"
,"ccccccccccc"
或者只是获取索引,而不遍历每个字符串?如果破折号位于模式之间,则它可以在左侧或右侧结束,只要它始终处理相同。
任何想法?
正则表达式MatchObject
结果包括匹配的索引。剩下的就是匹配重复的字符:
import re
repeat = re.compile(r'(?P<start>[a-z])(?P=start)+-?')
仅当给定字母字符 ( a
- z
) 至少重复一次时才会匹配:
>>> for match in repeat.finditer("aaaaabbbbbbbbbbbbbbccccccccccc"):
... print match.group(), match.start(), match.end()
...
aaaaa 0 5
bbbbbbbbbbbbbb 5 19
ccccccccccc 19 30
匹配结果的.start()
and.end()
方法为您提供输入字符串中的确切位置。
匹配中包含破折号,但不包含非重复字符:
>>> for match in repeat.finditer("a-bb-cccccccc"):
... print match.group(), match.start(), match.end()
...
bb- 2 5
cccccccc 5 13
如果您希望a-
零件匹配,只需将 替换+
为*
乘数:
repeat = re.compile(r'(?P<start>[a-z])(?P=start)*-?')
怎么用itertools.groupby
?
>>> s = 'aaaaabbbbbbbbbbbbbbccccccccccc'
>>> from itertools import groupby
>>> [''.join(v) for k,v in groupby(s)]
['aaaaa', 'bbbbbbbbbbbbbb', 'ccccccccccc']
这会将-
它们作为自己的子字符串,这些子字符串很容易被过滤掉。
>>> s = 'aaaaa-bbbbbbbbbbbbbb-ccccccccccc'
>>> [''.join(v) for k,v in groupby(s) if k != '-']
['aaaaa', 'bbbbbbbbbbbbbb', 'ccccccccccc']
str="aaaaabbbbbbbbbbbbbbccccccccccc"
p = [0]
for i, c in enumerate(zip(str, str[1:])):
if c[0] != c[1]:
p.append(i + 1)
print p
# [0, 5, 19]