質問: いろいろと調べてみましたが、なかなか理解に苦しんでおります。 下記のような条件の場合の正規表現を教えてください。 対象ファイル名について 1.n番目からm番目の文字列を抜き出す 2.n番目からm番目の文字列を削除する 3.最初からn番目までを抜き出す 4.最後からn番目までを抜き出す 例えば "sample12345_abc_181022.txt" から、pathlibのstemを使ってパス要素の末尾から拡張子を除いたものを取得して "sample12345_abc_181022" から "sample_abc_181022"を取り出したい="12345"を取り除きたい 先頭7番目から11番目を取り除きたい もしくは、 先頭1番目から6番目と12番目から22番目を取り出して繋げて書き出す。
回答: 以下のようなコードで概ね質問にある正規表現になると思います。例では、n = 3 m = 6 で文字列の位置は、0から数えるという条件にしています。なお、`str`はわかりやすいように数字にしていますが、英数大文字小文字特殊文字どれでも同じ結果になります。 ``` >>> import re >>> str = '0123456789' ``` 1.n番目からm番目の文字列を抜き出す ``` >>> re.match(r'.{3}(.{4})', str).group(1) '3456' ``` 2.n番目からm番目の文字列を削除する ``` >>> re.sub(r'(.{3})(.{4})', r'\g<1>', str) '012789' ``` 3.最初からn番目までを抜き出す ``` >>> re.match(r'.{3}', str).group(0) '012' ``` 4.最後からn番目までを抜き出す ``` >>> re.search(r'.{3}$', str).group(0) '789' ``` `.`が任意の文字にマッチし、`.{3}`で任意の文字の3文字にマッチします。 今回のケースであれば、以下のようにスライスをするのが簡単ですが、文字の種別が必要になった時には対応が難しくなります。 ``` str[n:m+1] str[:n] + str[m+1] str[:n] str[-n:] ```