Python按模式拆分字符串

时间:2013-04-18 15:19:00

标签: python regex string split

我有像"aaaaabbbbbbbbbbbbbbccccccccccc"这样的字符串。 字符的数量可以不同,有时字符串中可能会出现短划线,如"aaaaa-bbbbbbbbbbbbbbccccccccccc"

是否有任何智能方法可以将其分割为"aaaaa""bbbbbbbbbbbbbb""ccccccccccc"并获取索引,如果它是拆分的,或者只是获取索引,而不循环遍历每个字符串?如果短划线位于模式之间,它可以在左侧或右侧之间结束,只要它始终处理相同。

有什么想法吗?

3 个答案:

答案 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]