2013-03-11 95 views
2

內更換具體的數字我需要更換一個較長的字符串中出現的所有類似於此數字(角落):正則表達式/ Python的查找和字符串

[ 17 plane_17 \ 23 25 17 99 150 248 \ noname ] 

我的函數有一個「老」號被替換爲「新」號碼,例如如果舊的號碼是17,新的是19,那麼結果應該是:

[ 17 plane_17 \ 23 25 19 99 150 248 \ noname ] 

注意,僅在\數字\應更換(這也可能是/ /)。

要做到這一點,我試圖建立一個正則表達式替換以避免\以外的號碼\的意圖或/ /: newplane = re.compile(r"[^[_] (" + str(oldcorner) + ")").sub(str(newcorner), oldplane)

我很快意識到,這並不因爲從一開始的正則表達式搜索工作如果它與模式不匹配,則會失敗。

必須有一些聰明的做法仍然是我不知道的..任何建議?

+1

才具之間 '\\',或單一的 '\'?我的第一本能是將它拆分爲'\'(或double),在結果的每一個第二個元素上調用普通的舊替換(舊的,新的),然後在'\'處將它們連接在一起。雖然不是非常pythonic,但有興趣看看是否有人有一個整潔的方式 – 2013-03-11 14:20:02

+0

他們都將在單個'\'或單個'/'內。這不是一個壞主意!將刪除正則表達式.... – jodles 2013-03-11 14:23:55

+0

是啊會保持簡單,不知道你將如何處理'\'和'/'在同一行 – 2013-03-11 14:25:18

回答

3

您可以使用一個回調函數的正則表達式的子部分內:

import re 

def callback(match): 
    return match.group(0).replace('17', '19') 

s = "[ 17 plane_17 \ 23 25 17 99 150 248 \ noname ]" 

s = re.compile(r'\\.+?\\').sub(callback, s) 

print s 

打印:

[ 17 plane_17 \ 23 25 19 99 150 248 \ noname ] 
+1

斜槓到達哪裏? – 2013-03-11 14:31:04

+1

你說得對。編輯答案。 – vpekar 2013-03-11 14:35:39

+0

謝謝你,vpekar!真的聰明與回調函數! – jodles 2013-03-11 15:15:04

1

除了vpekar答案,你也可以用你的模式的反向引用的替換字符串,因此您可以嘗試匹配/\之間的所有字符,並使用新的編號和反向引用重新創建字符串:

line = '[ 17 plane_17 \ 23 25 17 99 150 248 \ noname ]' 
re.sub(r'([\\|/].*\s)(?:17)(\s.*[\\|/])', r'\g<1>19\2', line) 

返回:

'[ 17 plane_17 \ 23 25 19 99 150 248 \ noname ]' 
+0

謝謝asermax!我也非常喜歡這種單線解決方案!我的正則表達式知識顯然存在一些缺陷。謝謝! – jodles 2013-03-11 15:15:37

+0

沒問題,很高興幫忙:3 – asermax 2013-03-11 16:01:28

相關問題