2012-07-19 76 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