2016-02-29 68 views
2

我想在一行中多次替換某個模式(字母表之間的空格)。
這裏是我的代碼:如何在python3中使用re模塊替換模式

s = re.sub('([a-z]) ([a-z])', '\g<1>_\g<2>', 'series m coupe')

我有望取代'系M Coupe''series_m_coupe',但我得到的是'series_m跑車'。即使我把count=0,它沒有工作...

我想這是因爲「m」是1音節。當我把1個多音節像「系列小型跑車」,即工作:

s = re.sub('([a-z]) ([a-z])', '\g<1>_\g<2>', 'series mini coupe') 
s 
'series_mini_coupe' 

回答

1

當您使用([a-z]) ([a-z]),該s mseries m coupe匹配和正則表達式指數m後。所以,正則表達式引擎正在尋找該字母后的第二個匹配項,並且找不到任何匹配項。

你需要使用一個超前匹配重疊的字符串:

s = re.sub('([a-z]) (?=[a-z])', '\g<1>_', 'series m coupe') 
        ^^^ ^

regex demo

如果空間之後以小寫ASCII字母(?=[a-z])先行將檢查,但不會使用它。在替換模式中,應該刪除\g<2>,因爲不再有第二個捕獲組。

+1

哇!多麼聰明,美妙的代碼!謝謝,我不知道「向前看」。這真的很有用:) –