6

我有像"aaaaabbbbbbbbbbbbbbccccccccccc". 字符的数量可能不同,有时字符串内可能会有破折号,例如"aaaaa-bbbbbbbbbbbbbbccccccccccc".

有没有什么聪明的方法可以拆分它"aaaaa",获取它的索引"bbbbbbbbbbbbbb""ccccccccccc"或者只是获取索引,而不遍历每个字符串?如果破折号位于模式之间,则它可以在左侧或右侧结束,只要它始终处理相同。

任何想法?

4

3 回答 3

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()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)*-?')
于 2013-04-18T15:25:37.593 回答
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']
于 2013-04-18T15:25:01.343 回答
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]
于 2013-04-18T15:35:21.273 回答