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) が少なくとも 1 回繰り返される場合にのみ一致します。

>>> 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)*-?')
于 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 に答える