動的パターンを指定して部分文字列を置き換える正規表現ソリューションを探しています。問題は、部分文字列に既知のトークンが含まれている可能性があり、このトークンがどの位置で発生するかがわからないことです。問題は次のように定式化できます。(既知の)トークンが競合する場合でも、文字列内の(指定された)パターンを置き換えます。
my_stringがあるとしましょう:
私は緑とPLUSの青豆が好きです!
PLUSは、一致を妨げる場合に無視したい既知のトークンを表します。
my_patternという変数パターンもあります。これは、次のようなPLUS以外のmy_stringの任意の部分にすることができます。
1)緑と青
2)緑豆と青豆
3)私は緑が好きです
私たちは知っていPLUS内のどこかで発生する可能性がありmy_stringを、我々は位置を知りません。理論的には、my_stringは次のようにもなります。
I PLUS緑、青の豆のような!
以来my_patternは、2)又は3))形態1で発生することができ、我々はまた、論理和を用いて溶液をハードコーディングすることができません。
求められる解決策は次のようなものです。my_string.replace(my_pattern、 "red")とmy_patternの出力:
1)小豆が好き!
2)私は赤が好きです!
3)赤豆とプラス青豆!
PLUSはmy_stringで発生しますが(my_patternと競合する可能性があります)、my_patternは一致します。これは次のようなものです。my_patternを一致させ、一致を妨げる場合はPLUSを無視します。
トークンの正規表現がすべての文字の間に追加されるようにパターンを変更できます。
明示的に説明しなかったことは、トークンは文字列にもスペースを追加するため、トークン正規表現は左右のスペースも検索する必要があるということです。
import re
token = 'PLUS'
patterns = ['green and blue', 'green and blue beans', 'I like green']
ptn_pls = [f'( ?{token} ?)?'.join(p) for p in patterns]
3つの異なる文字列に適用されます。
my_string = 'I like green and PLUS blue beans!'
for p in ptn_pls:
print(re.sub(p, 'red', my_string))
# I like red beans!
# I like red!
# red and PLUS blue beans!
my_string = 'I PLUS like green and blue beans!'
for p in ptn_pls:
print(re.sub(p, 'red', my_string))
# I PLUS like red beans!
# I PLUS like red!
# red and blue beans!
my_string = 'I like grPLUSeen a PLUSnd blue beans!'
for p in ptn_pls:
print(re.sub(p, 'red', my_string))
# I like red beans!
# I like red!
# red a PLUSnd blue beans!
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加