如何获得模式的复制次数并使用i

2024-09-28 21:00:07 发布

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

例如,有一个类似aaaaaab的字符串,其中a重复n次(在本例中,n=6)。我怎么能得到n号?你知道吗

如果我想用n来代替它,使a变成n/2倍,比如aaab,或者n-2倍aaaab。怎么处理?你知道吗


Tags: 字符串本例aaabaaaabaaaaaab
3条回答

单靠正则表达式是做不到的。但是您可以使用正则表达式来提取a的字符串,然后检查其长度。你知道吗

然后您可以创建一个适当长度的替换字符串并进行替换。你知道吗

要将出现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
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'

相关问题 更多 >