Python按模式拆分字符串

2024-10-01 09:37:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有类似"aaaaabbbbbbbbbbbbbbccccccccccc"的字符串。 字符的数量可能不同,有时字符串中可能有破折号,如"aaaaa-bbbbbbbbbbbbbbccccccccccc"。在

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

有什么想法吗?在


Tags: 方法字符串数量模式字符cccccccccccaaaaa破折号
3条回答

使用itertools.groupby怎么样?在

>>> s = 'aaaaabbbbbbbbbbbbbbccccccccccc'
>>> from itertools import groupby
>>> [''.join(v) for k,v in groupby(s)]
['aaaaa', 'bbbbbbbbbbbbbb', 'ccccccccccc']

这将把-作为自己的子串,很容易被过滤掉。在

^{pr2}$

正则表达式MatchObject结果包括匹配项的索引。剩下的就是匹配重复字符:

import re

repeat = re.compile(r'(?P<start>[a-z])(?P=start)+-?')

仅当给定字母字符(a-z)至少重复一次时匹配:

^{pr2}$

匹配结果上的^{}^{}方法提供了输入字符串中的确切位置。在

匹配项中包括破折号,但不包括非重复字符:

>>> 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)*-?')
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]

相关问题 更多 >