2024-10-01 09:37:16 发布
网友
我有类似"aaaaabbbbbbbbbbbbbbccccccccccc"的字符串。 字符的数量可能不同,有时字符串中可能有破折号,如"aaaaa-bbbbbbbbbbbbbbccccccccccc"。在
"aaaaabbbbbbbbbbbbbbccccccccccc"
"aaaaa-bbbbbbbbbbbbbbccccccccccc"
有没有什么聪明的方法可以拆分它"aaaaa","bbbbbbbbbbbbbb","ccccccccccc"并得到被拆分的索引,还是只获取索引,而不必遍历每个字符串?如果破折号在到模式之间,它可以结束在左或右模式,只要它总是处理相同。在
"aaaaa"
"bbbbbbbbbbbbbb"
"ccccccccccc"
有什么想法吗?在
使用itertools.groupby怎么样?在
itertools.groupby
>>> s = 'aaaaabbbbbbbbbbbbbbccccccccccc' >>> from itertools import groupby >>> [''.join(v) for k,v in groupby(s)] ['aaaaa', 'bbbbbbbbbbbbbb', 'ccccccccccc']
这将把-作为自己的子串,很容易被过滤掉。在
-
正则表达式MatchObject结果包括匹配项的索引。剩下的就是匹配重复字符:
MatchObject
import re repeat = re.compile(r'(?P<start>[a-z])(?P=start)+-?')
仅当给定字母字符(a-z)至少重复一次时匹配:
a
z
匹配结果上的^{}和^{}方法提供了输入字符串中的确切位置。在
匹配项中包括破折号,但不包括非重复字符:
>>> for match in repeat.finditer("a-bb-cccccccc"): ... print match.group(), match.start(), match.end() ... bb- 2 5 cccccccc 5 13
如果希望a-部分匹配,只需将+替换为*乘数:
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]
使用
itertools.groupby
怎么样?在这将把
^{pr2}$-
作为自己的子串,很容易被过滤掉。在正则表达式
MatchObject
结果包括匹配项的索引。剩下的就是匹配重复字符:仅当给定字母字符(
^{pr2}$a
-z
)至少重复一次时匹配:匹配结果上的^{} 和^{} 方法提供了输入字符串中的确切位置。在
匹配项中包括破折号,但不包括非重复字符:
如果希望
a-
部分匹配,只需将+
替换为*
乘数:相关问题 更多 >
编程相关推荐