2016-02-04 44 views
1

我想只替換傳入re.sub的正則表達式的部分([^\d+]只是爲了確保在此之後沒有數字,即整個整數(全部數字)被捕獲)。但是,下面的代碼會替換下一個字符(即在第一個示例中吞嚥下一個「」)。用re.sub替換正則表達式的一部分

import re 
pattern = r'foo-%d[^\d+]' 

k = 12 # only substitute entire "foo-12" occurrences 
result = re.sub(pattern % k, '@foo-%[email protected]' % k, 'dasds foo-12 gfd9843') 
# got: result == 'dasds @[email protected]' 
assert result == 'dasds @[email protected] gfd9843', result 

k = 1 # only substitute entire "foo-1" occurrences 
result = re.sub(pattern % k, '@foo-%[email protected]' % k, 'dasds foo-12 gfd9843') 
assert result == 'dasds foo-12 gfd9843', result 

k = 1 # only substitute entire "foo-1" occurrences 
result = re.sub(pattern % k, '@foo-%[email protected]' % k, 'dasds foo-11 gfd9843') 
assert result == 'dasds foo-11 gfd9843', result 

我該如何解決這個問題?我是否至少在正則表達式的正確軌道上?

回答

0

使用\b這裏

import re 
k = 12 # only substitute entire "foo-12" occurrences 
s = 'dasds foo-12 gfd9843' 
result = re.sub(r'foo-%d\b' % k, '@foo-%[email protected]' % k, s) 

# got: result == 'dasds @[email protected]' 
assert result == 'dasds @[email protected] gfd9843', result 


k = 1 # only substitute entire "foo-1" occurrences 
result = re.sub(r'foo-%d\b' % k, '@foo-%[email protected]' % k, s) 
assert result == 'dasds foo-12 gfd9843', result 
+0

不知道什麼'\ B'做,但是'+'不起作用。看到我添加的測試用例。 – orange

+0

@orange sry'+'不需要......現在就試試 – vks