1. ホーム
  2. python

[解決済み] python re.subでマッチの一部分だけを置換する方法

2023-06-08 12:21:23

質問

1つのREG式で2つのケースをマッチさせ、置換を行う必要があります。

'long.file.name.jpg' -> 'long.file.name_' -> 'long.file.name_' -> 'long.file.name_' -> suff .jpg'

'long.file.name_ a .jpg' -> 'long.file.name_ suff .jpg'

以下のようにしようとしています。

re.sub('(\_a)?\.[^\.]*$' , '_suff.',"long.file.name.jpg")

しかし、これは拡張子'.jpg'をカットしているので

long.file.name_suff.ではなく、long.file.name_suff.となります。 これは[^.]*$の部分が原因だと理解しているのですが、これを除外することができないのです。 最後の'_a'を置換するか、最後の'.'を見つけなければならないからです。

マッチした部分のみを置換する方法はありますか?

どのように解決するのですか?

 re.sub(r'(?:_a)?\.([^.]*)$', r'_suff.\1', "long.file.name.jpg")

?: は、マッチしないグループ ( SO回答 ) が始まるので (?:_a) が一致するのは _a にマッチするが、列挙はしないので、次のクエスチョンマークでオプションにする。

つまり、英語では、これは、末尾に一致する .<anything> に続く(あるいは続かない)パターン _a

もう一つの方法として、このように ルックビハインド ( こちらをご覧ください ). 超便利なのですが、15年間REをやっていて知らなかったので、これを書いておきます。