多个re.sub()语句

4
在我的程序中,用户输入一个术语,我会在发送之前进行处理。这个过程的一部分是将所有“and”、“or”和“not”的实例改为大写字母,但保留其余内容不变。
我不能使用string.upper(),因为它会将所有内容都转换为大写字母;或者使用string.replace(),因为如果字符串中的“and”出现在另一个单词中,例如“salamander”,它也会将其更改为“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
1个回答

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这样的混合大小写单词。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接