2

別の文字列で文字列を検索し、大文字と小文字を区別しない方法で検索されるたびに前後にテキストを挿入しようとしています。

私は次のことを思いつきましたが、それはうまくいきますが、それは理想的とは言えないので、誰かがより効率的なアプローチを持っているかどうか疑問に思いました。

import re

test_string = "My name is Jon not jon."

search = re.compile(re.escape('jon'), re.IGNORECASE)

find = re.findall(search, test_string)

for found in find:
    test_string = test_string.replace(found, '<span>%s</span>' % found)

print test_string

"My name is <span>Jon</span> not <span>jon</span>"

任意のアイデアをいただければ幸いです。

4

2 に答える 2

3

これがre.sub目的です:

>>> re.sub('(?i)(jon)', r'<span>\1</span>', s)
'My name is <span>Jon</span> not <span>jon</span>.'

(?i)代わりにre.I(ただし、2つの間に違いはありません)を使用\1し、置換文字列のグループをキャプチャしたことに注意してください)

別の注意点:要件に応じて、「jonathan」などではなく、実際には「jon」という単語のみを置き換えるように、単語の境界などの使用を検討することをお勧めします。

于 2013-01-21T03:19:14.217 に答える
1
import re
test_string = "My name is Jon not jon."
output = re.sub('([jJ]on)',r'<span>\1</span>', test_string)
print output

出力:

My name is <span>Jon</span> not <span>jon</span>.

正規表現の一致をより賢くフィルタリングしたい場合は、likeのspace前後に配置することをお勧めします。したがって、単語のみに一致します。[Jj]on( [Jj]on )jon

output = re.sub('( [jJ]on )',r'<span>\1</span>', test_string)

または 編集: @Jon Clements が示唆したように、スペースの代わりに単語の境界を使用できます。

于 2013-01-21T03:22:59.630 に答える