0

たとえば、n 回繰り返す (この場合は n=6) のような文字列がありaaaaaabますa。数値 n を取得するにはどうすればよいですか?

a次に、 n を使用して、 のように n/2 回aaab、または n-2 回に置き換え aaaabます。それをどうするか?

4

4 に答える 4

7
s = 'aaaaabbcdddddddd'
[(m.group(1), len(m.group(2))+1) for m in re.finditer(r'(\w)(\1*)', s)]

戻り値

[('a', 5), ('b', 2), ('c', 1), ('d', 8)]

これを使用して文字グループを置き換えるには:

re.sub(r'(\w)(\1*)', lambda m: m.group(1)*f(len(m.group(2))+1), s)

と:

f = lambda x: x - 2 # returns 'aaadddddd'
f = lambda x: x / 2 # returns 'aabdddd'
f = lambda x: x + 1 # returns 'aaaaaabbbccddddddddd'
于 2012-12-18T10:07:00.623 に答える
0

何度も現れるリテラルnパターンを同じパターンが繰り返されるものに置き換えるには、次のn/2ようにします。

>>> import re
>>> text = 'aaaaaab'
>>> re.sub('aa', 'a', text)
'aaab'

パターンがリテラル一致でない場合、これは機能せず、正規表現のみを使用して機能させる方法はありません。あなたができることは、を使用することre.finditerであり、一致する情報が与えられたら、それらを必要なものに置き換えます。

たとえば、n/2オカレンスに置き換えるには、次のようにします。

>>> text = 'aaaaaab something else aaaab'
>>> matches = list(re.finditer('a+', text))
>>> displ = 0
>>> for match in matches:
...     num_repeat = match.end() - match.start()  #depending on the pattern
...     text = text[:match.start() - displ] + 'a' * (num_repeat // 2) + text[match.end() - displ:]
...     displ += num_repeat // 2
... 
>>> print text
aaab something else aab

n-2または、オカレンスに置き換えるには:

>>> text = 'aaaaaab something else aaaab'
>>> matches = list(re.finditer('a+', text))
>>> displ = 0
>>> for match in matches:
...     num_repeat = match.end() - match.start()
...     text = text[:match.start() - displ] + 'a' * (num_repeat - 2) + text[match.end() - displ:]
...     displ +=  2
... 
>>> print text
aaaab something else aab
于 2012-12-18T10:08:12.630 に答える
0

たとえば、aaaaaab のように、a が n 回繰り返される文字列があります (この場合、n=6)。数値 n を取得するにはどうすればよいですか?

チェックしたい文字が分かっていて、繰り返し回数だけ知りたい場合:

>>> from collections import Counter
>>> Counter(i for i in 'aaaaaabbbbbbc')['a']
6

どの文字が何回繰り返されたかを知りたい場合:

>>> [{k:v} for k,v in Counter(i for i in 'aaaaaabbbbbbc').iteritems() if v > 1]
[{'a': 6}, {'b': 6}]
于 2012-12-18T10:18:15.427 に答える
0

正規表現だけではできません。ただし、正規表現を使用して の文字列を抽出し、aその長さを確認できます。

次に、適切な長さの置換文字列を作成し、置換を実行できます。

于 2012-12-18T10:05:18.957 に答える