2014-01-18 18 views
1

例如,假設我想將以下文本中的每個單詞'a'更改爲'an':Python re.sub僅將字母「a」而不是字母「a」的每個實例更改爲

"a apple is a| awesome fruit." 

假設「|」角色是作爲一個垃圾角色,需要解決。 我希望最終產品如下:

"an apple is an| awesome fruit." 

到目前爲止,我已經得到最接近的是用下面的代碼:

>>> s = 'a apple is a| awesome fruit.' 
>>> regex = '[^A-Za-z0-9](a)[^A-Za-z0-9]' 
>>> s = re.sub(regex, 'an', s) 
>>> s 
'a apple isan awesome fruit.' 

「A」顯示出在該年初增長字符串根本沒有受到影響,而由垃圾隨後發出的'a'則殘留在該區域中的字符串。我明白爲什麼會發生這種情況,我只是不知道如何讓正則表達式適合這種情況。我的計劃是隻改變子字符串組(a),但我不知道如何在re.sub中使用它。我怎樣才能替代子串組?有沒有更好的方法在這種情況下使用正則表達式模式?

回答

4

您可以使用單詞邊界的(\b\w類和\W類之間的匹配(或\w^\w$):

>>> s = 'a apple is a| awesome fruit.' 
>>> regex = r'\ba\b' 
>>> s = re.sub(regex, 'an', s) 
>>> s 
'an apple is an| awesome fruit.' 
1

\b word邊界這裏是一個很好的答案,更一般的結構被稱爲「向前看」和「向後看」。在這裏看起來像:

re.sub(r'\ba\b', 'an', s) 

re.sub(r'((?<=\W)|^)a((?=\W)|$)', 'an', s) 
+0

確實!我只是爲了性能上的原因儘量避免使用lookaround :) – Jerry

+0

@jerry與正則表達式匹配'(\ W | ^)a(\ W | $)'沒有任何不同。你確定你沒有考慮反向引用嗎? – U2EF1

+0

外觀和捕捉需要多一點處理,因爲正則表達式必須首先錨定,然後匹配查找內的任何內容,然後再回來匹配任何匹配的內容。與[this](http://regex101.com/r/hI1tW0)相比,[this](http://regex101.com/r/wR2yT7/#debugger)更容易理解。我還提到了捕獲,因爲捕獲意味着腳本將不得不分配更多的內存來存儲捕獲。 (?<= \ W | ^)a(?= \ W | $)' – Jerry

相關問題