多个re.sub()语句

时间:2012-07-19 16:20:16

标签: python regex string

在我的程序中,用户输入我在发送之前处理的术语。这个过程的一部分是将'and','或'和'not'的所有实例更改为大写字母,但保留其余部分。

我无法使用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

1 个答案:

答案 0 :(得分: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等混合大小写字词。