例如,有一个像aaaaaab
这样的字符串,其中a
重复n次(在这种情况下,n = 6)。我怎么能得到数字n?
然后,如果我想使用n将其替换为a
至n / 2次,如aaab
,或n-2次aaaab
。该怎么办?
答案 0 :(得分: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'
答案 1 :(得分:0)
单独使用正则表达式无法做到这一点。但您可以使用正则表达式提取a
的字符串,然后检查其长度。
然后你可以创建一个适当长度的替换字符串并进行替换。
答案 2 :(得分: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
答案 3 :(得分:0)
例如,有一个像aaaaaab这样的字符串,其中重复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}]