2012-07-19 75 views
4

在我的程序中,用戶在發送之前輸入一個術語。這個過程的一部分是將'和','或'和'不是'的所有實例改爲大寫字母,但其餘部分保持不變。多個re.sub()語句

我不能使用string.upper(),因爲它將所有內容都改爲大寫;或string.replace(),因爲如果'和'是該字符串中的另一個詞,例如'蠑螈'它也將改變爲'salamANDer'。我認爲我最好的選擇是正則表達式re.sub()函數。這使我可以改變完美的單詞。下一個問題:我必須爲我想要做的每個更改做一個re.sub()函數。是否有可能做出一個聲明來做所有的改變?我所做的是沒有錯的,但我不認爲它一定是很好的做法:

>>import urllib2 
>>import re 
>>query = 'Lizards and Amphibians not salamander or newt' 
>>query=re.sub(r'\bnot\b', 'NOT',query) 
>>query=re.sub(r'\bor\b', 'OR',query) 
>>query=re.sub(r'\band\b', 'AND',query) 
>>query = urllib2.quote("'"+query+"'") 

>>print query 
%27Lizards%20AND%20Amphibians%20NOT%20salamander%20OR%20newt%27 

回答

17

可以在re.sub()傳遞函數替換表達式:

>>> term = "Lizards and Amphibians not salamander or newt" 
>>> re.sub(r"\b(not|or|and)\b", lambda m: m.group().upper(), term) 
'Lizards AND Amphibians NOT salamander OR newt' 

不過,我可能會去用非正則表達式的解決方案:

>>> " ".join(s.upper() if s.lower() in ["and", "or", "not"] else s 
...   for s in term.split()) 
'Lizards AND Amphibians NOT salamander OR newt' 

這也歸一化的空白和與像And大小寫混合字作品。

+0

大斯文謝謝你。更好的編碼實踐! – adohertyd 2012-07-19 16:25:12

+1

+1,非常漂亮的短版。 – 2012-07-19 16:26:07