我想在一行中多次替换某些模式(字母表之间的空格)。
这是我的代码:
s = re.sub('([a-z]) ([a-z])', '\g<1>_\g<2>', 'series m coupe')
我希望将'series m coupe'替换为'series_m_coupe',但我得到的是'series_m coupe'。即使我放count=0
,它也不起作用......
我猜是因为“m”是1个音节。当我把'系列迷你小轿车'等超过1个音节时,有效:
s = re.sub('([a-z]) ([a-z])', '\g<1>_\g<2>', 'series mini coupe')
s
'series_mini_coupe'
答案 0 :(得分:1)
当您使用([a-z]) ([a-z])
时,s m
与series m coupe
匹配,正则表达式索引位于m
之后。因此,正则表达式引擎正在寻找该信之后的第二场比赛,并且找不到任何。
您需要使用前瞻来匹配重叠的字符串:
s = re.sub('([a-z]) (?=[a-z])', '\g<1>_', 'series m coupe')
^^^ ^
请参阅regex demo
(?=[a-z])
前瞻将检查空格是否后跟一个小写的ASCII字母,但不会消耗它。在替换模式中,应删除\g<2>
,因为不再有第二个捕获组。