2014-12-07 19 views
0

我爲不恰當的主題標題道歉,但我不知道如何定義它。取代python中的部分字符串2.7

我有一個字符串,它看起來像如下:

string = 'b<3 and d >4 or 4<=a <20' 

我想改變這種上串入下列操作之一:

new_string = 'b[n]<3 and d[n] >4 or 4<=a[n] <20' 

使用功能與string.replace似乎是不成功(例如:string.replace('d','d [n]'),因爲字符串的其他部分也被修改過了(例如結果:'b < 3和[n] d [n]> 4或4 < = a < 20'))。 我想知道python的're'模塊是否適合這份工作?

我正在使用python 2.7。 謝謝。

回答

2

使用re.sub;捕獲組和反向引用:

>>> import re 
>>> re.sub(r'\b([a-z])\b', r'\1[n]', 'b<3 and d >4 or 4<=a <20') 
'b[n]<3 and d[n] >4 or 4<=a[n] <20' 

[a-z]匹配一個字母字符。 \b用於確保變量名被word boundary包圍;使模式只匹配單個字符的變量名稱。

(...)是使圖案爲captured as a group(第一組),並且可以在替換字符串中引用爲\1

UPDATE

如果你想更換任何變量的名字,你可能需要檢查匹配的部分是否有效的變量。以下示例使用keyword.iskeyword來檢查匹配的變量名是否不是關鍵字。

>>> import re 
>>> import keyword 
>>> 
>>> def replace_var(m): 
...  varname = m.group() 
...  if keyword.iskeyword(varname) or varname[0].isdigit(): 
...   return varname 
...  return varname + '[n]' 
... 
>>> re.sub(r'\w+', replace_var, 'b<3 and d >4 or 4<=a <20') 
'b[n]<3 and d[n] >4 or 4<=a[n] <20' 

注意:替換可以是一個函數,如上所示;該函數獲取一個匹配對象,並將該函數的返回值用作替換字符串。

+0

感謝您的快速回復falsetru。 你會推薦一些關於python的're'模塊的初學者友好教程嗎? 我看了一下: https://docs.python.org/2/library/re.html, https://docs.python.org/2/howto/regex.html, http:///www.tutorialspoint.com/python/python_reg_expressions.htm, ,但所有這些都不是初學者友好的。 – marco 2014-12-07 01:10:53

+0

@marco,其實https://docs.python.org/2/howto/regex.html是我第一次接觸正則表達式。 – falsetru 2014-12-07 01:12:03

+0

謝謝。所以我沒有希望開始學習它。 – marco 2014-12-07 01:14:19