2013-10-08 143 views
0

我想要實現的是用變量(變量的內容)用python正則表達式替換字符串。由於我需要保留一些匹配的表達式,因此我使用\1\3組匹配參數。python正則表達式使用變量代表表達式

我的正則表達式/子看起來是這樣的:

pattern = "\1" + id + "\3" \b 
out = re.sub(r'(;11=)(\w+)(;)',r'%s' % pattern, line) 

這似乎是發生的是\1\3沒有得到添加到輸出。

我也用替換表達式嘗試這樣做:

r'\1%s\3'%orderid 

但我得到了類似的結果。 任何可能解決此問題的建議?

+1

爲什麼你甚至需要將這些匹配存儲在'\ 1'和'\ 3'中?它們始終是相同的值,只是把它們作爲字符串。 're.sub(r'(; 11 =)(\ w +)(;)',「; 11 =」+ id +「;」,line)',或者完全移除捕獲:'re.sub(r' ; 11 = \ w +;',「; 11 =」+ id +「;」,line)'(並且您似乎並沒有使用'\ w +')。 – Jerry

+0

我嘗試了其他的,但這是最終對我的工作。謝謝傑裏。我不相信我沒有看到。 – Pradyot

回答

1

您需要使用原始字符串或雙倍的反斜槓:

pattern = r"\1" + id + r"\3" 

pattern = "\\1" + id + r"\\3" 

在常規的Python字符串文字,\number被解釋爲一個八進制字符代碼,而不是:

>>> '\1' 
'\x01' 

雖然反斜槓沒有特別的意義n中的原始字符串字面:

>>> r'\1' 
'\\1' 

原始字符串字面量僅僅是符號,不是一個類型。 r''''都產生字符串,並且僅在它們如何解釋源代碼中的反斜槓方面有所不同。

請注意,由於組1和組3匹配文字文本,您根本不需要使用替換;簡單地使用:

out = re.sub(r';11=\w+;', ';11=%s;' % id, line) 

或使用向後看和向前看,並放棄不必重複文字:

out = re.sub(r'(?<=;11=)\w+(?=;)', id, line) 

演示:

>>> import re 
>>> line = 'foobar;11=spam;hameggs' 
>>> id = 'monty' 
>>> re.sub(r';11=\w+;', ';11=%s;' % id, line) 
'foobar;11=monty;hameggs' 
>>> re.sub(r'(?<=;11=)\w+(?=;)', id, line) 
'foobar;11=monty;hameggs' 
0

這是行不通的:

pattern = "\1" + id + "\3" 
# ... 
r'%s' % pattern 

r前綴僅影響文字的解釋方式。因此,r'%s'表示%s將被解釋爲原始 - 但這與在沒有r的情況下解釋它們的方式相同。同時,pattern有非原始文字"\1""\3",所以它已經是一個控制-A和一個控制-C,然後你甚至可以進入%

你想要的是:

pattern = r"\1" + id + r"\3" 
# ... 
'%s' % pattern 

不過,你真的不需要%格式在所有;只需使用pattern本身就可以得到完全相同的結果。