我有像"aaaaabbbbbbbbbbbbbbccccccccccc"
这样的字符串。
字符的数量可以不同,有时字符串中可能会出现短划线,如"aaaaa-bbbbbbbbbbbbbbccccccccccc"
。
是否有任何智能方法可以将其分割为"aaaaa"
,"bbbbbbbbbbbbbb"
,"ccccccccccc"
并获取索引,如果它是拆分的,或者只是获取索引,而不循环遍历每个字符串?如果短划线位于模式之间,它可以在左侧或右侧之间结束,只要它始终处理相同。
有什么想法吗?
答案 0 :(得分:11)
正则表达式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()
和.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)*-?')
答案 1 :(得分:3)
如何使用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']
答案 2 :(得分:0)
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]