4

私のプログラムでは、送信する前に処理する用語をユーザーが入力します。このプロセスの一部として、「and」、「or」、および「not」のすべてのインスタンスを大文字に変更しますが、残りはそのままにします。

string.upper()すべてを大文字に変更するため、使用できません。またはstring.replace()、「and」が文字列内の別の単語、たとえば「salamander」にある場合、それも「salamANDer」に変更されます。私の最良の選択肢は正規表現re.sub()関数だと思います。これにより、完璧な完全な単語を変更できます。次の問題: 行いre.sub()たい変更ごとに関数を実行する必要があります。1 つのステートメントですべての変更を行うことは可能ですか? 私がやったことは間違っていませんが、必ずしも良い習慣だとは思いません:

>>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
4

1 に答える 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ます。

于 2012-07-19T16:22:54.197 に答える