Python:文字列をprefixStringSuffixに置き換え、元の大文字小文字を保持しますが、一致を検索するときに大文字小文字を無視します
質問
だから私がやろうとしているのは、文字列<!> quot; keyword <!> quot;と
"<b>keyword</b>"
より大きな文字列で。
例:
myString = <!> quot;こんにちは。あなたは仕事のためにその人を高くすべきです。こんにちは。<!> quot;
keyword = <!> quot; hi <!> quot;
結果は次のようになります:
result = "<b>HI</b> there. You should higher that person for the job.
<b>Hi</b> <b>hi</b>."
ユーザーがキーワードを入力するまで、キーワードがわからない クエリが実行されるまでコーパス(myString)を知りません。
ほとんどの場合に機能するソリューションが見つかりましたが、いくつかの誤検出があります。
namely it would return "<b>hi<b/>gher"
これは私が望むものではありません。また、私は
元のテキストの大文字と小文字を保持しようとしていますが、マッチングには
ケースに関係なく配置します。キーワードが<!> quot; hi <!> quotの場合、交換する必要があります
HI with <b>HI</b> and hi with <b>hi</b>.
私が最も近づいたのは、これのわずかに派生したバージョンを使用することです: http://code.activestate.com/recipes/576715/ しかし、上記のすべての誤検知を修正するために文字列の2番目のパスを実行する方法を理解できませんでした。
またはNLTKのWordPunctTokenizerを使用します(句読点のようなものを単純化します) しかし、私はそれが与えられていないので、どのように文を元に戻すかわかりません 逆の機能があり、myStringの元の句読点を保持したい。必須、すべてのトークンを連結しても元のトークンは返されません 文字列。たとえば、<!> quot; 7-7 <!> quot;を置き換えたくありません。 with <!> quot; 7-7 <!> quot;元のテキストに<!> quot; 7-7 <!> quot;が含まれていた場合、トークンを元のテキストに再グループ化するとき。
十分に明確であったことを願っています。単純な問題のように思えますが、それは思ったよりも少し難しいことが判明しました。
解決
これでいいですか?
>>> import re
>>> myString = "HI there. You should higher that person for the job. Hi hi."
>>> keyword = "hi"
>>> search = re.compile(r'\b(%s)\b' % keyword, re.I)
>>> search.sub('<b>\\1</b>', myString)
'<b>HI</b> there. You should higher that person for the job. <b>Hi</b> <b>hi</b>.'
他のヒント
単語境界でのみ一致する単語境界アサーションre.sub
を使用して、\b
で非常に簡単にこれを行うことができるはずです:
import re
def SurroundWith(text, keyword, before, after):
regex = re.compile(r'\b%s\b' % keyword, re.IGNORECASE)
return regex.sub(r'%s\0%s' % (before, after), text)
次のようになります:
>>> SurroundWith('HI there. You should hire that person for the job. '
... 'Hi hi.', 'hi', '<b>', '</b>')
'<b>HI</b> there. You should hire that person for the job. <b>Hi</b> <b>hi</b>.'
<!> quot;単語境界、<!> quot;を構成するものについてより複雑な基準がある場合次のようにする必要があります。
def SurroundWith2(text, keyword, before, after):
regex = re.compile(r'([^a-zA-Z0-9])(%s)([^a-zA-Z0-9])' % keyword,
re.IGNORECASE)
return regex.sub(r'\1%s\2%s\3' % (before, after), text)
[^a-zA-Z0-9]
グループを変更して、<!> quot; non-word。<!> quot;とみなすものに一致させることができます。
最良の解決策は正規表現だと思います...
import re
def reg(keyword, myString) :
regx = re.compile(r'\b(' + keyword + r')\b', re.IGNORECASE)
return regx.sub(r'<b>\1</b>', myString)
もちろん、最初にキーワード<!> quot; regular expression safe <!> quot;を作成する必要があります。 (正規表現の特殊文字を引用してください)。
ここでは、選抜委員会からの提案があります。 :-)
myString = "HI there. You should higher that person for the job. Hi hi."
myString.replace('higher','hire')