2

たとえば、次の文字列があるとします。

s = 'Back in BLACK, I hit the sAck, I've been too LOng I'm glad to be back.'

上記の文字列で、大文字と小文字を区別しない方法で特定の単語を検索して次の単語に置き換えたい

黒:b ***

袋:s ***

長い:l ***

うれしい:g ***

結果の文字列を

s = 'Back in B****, I hit the s***, I've been too L*** I'm glad to be back.'

基本的に、上記の文字列は、私が置き換える単語の最初の文字の大文字と小文字を維持します。単語の後の文字は「*」で終わります

代わりのリストを作成する必要があると思います。Djangoでは、現在replace_all()関数を使用していますが、大文字と小文字が区別されます。したがって、BLACKやsAckのような単語の場合、組み合わせが多いため、これは困難な作業になります。

どうすればこれを行うことができますか?

4

2 に答える 2

5

reモジュールを使用します。これが「黒」の簡単な例です。

>>> import re
>>> s = "Back in BLACK, I hit the sAck, I've been too LOng I'm glad to be back."
>>> regex = re.compile(r'black', flags=re.IGNORECASE)
>>> regex.sub('b***', s)
"Back in b***, I hit the sAck, I've been too LOng I'm glad to be back."

最初の文字の大文字小文字を区別するには、それをキャプチャして、代わりに後方参照を使用します。

>>> regex = re.compile(r'(b)lack', flags=re.IGNORECASE)
>>> regex.sub(r'\1***', s)
"Back in B***, I hit the sAck, I've been too LOng I'm glad to be back."

1回のパスですべての置換を行うには:

>>> regex = re.compile(r'(?=(.))(?:black|sack|long|glad)', flags=re.IGNORECASE)
>>> regex.sub(r'\1***', s)
"Back in B***, I hit the s***, I've been too L*** I'm g*** to be back."
于 2013-02-11T17:25:26.820 に答える
2

これは少し密度が高いですが、機能します:

>>> re.sub(
        r"(?i)\b(black|sack|long|glad)\b", 
        lambda m: m.group()[0] + "*"*(len(m.group())-1), 
        s
        )
"Back in B****, I hit the s***, I've been too L*** I'm g*** to be back."
于 2013-02-11T17:32:27.223 に答える