3番目のアンダースコアとドットの間に英数字を追加したい(以下の例)
CSV_20121023000854Z_MMSC_35dbc3f813.csv
期待される出力:
35dbc3f813
このregixは問題を解決し(\_\w{15}\_\w{4}\_)(\w+)
ますが、文字列のサイズが大きくなった場合に備えて、より柔軟にしたいと思います。ありがとう
3番目のアンダースコアとドットの間に英数字を追加したい(以下の例)
CSV_20121023000854Z_MMSC_35dbc3f813.csv
期待される出力:
35dbc3f813
このregixは問題を解決し(\_\w{15}\_\w{4}\_)(\w+)
ますが、文字列のサイズが大きくなった場合に備えて、より柔軟にしたいと思います。ありがとう
どうしてこんなものじゃないの?
_([^_]+)\.csv
最後の下線との間のすべてをキャプチャします.csv
。
または、選択した言語で分割することもできます。
>>> s = 'CSV_20121023000854Z_MMSC_35dbc3f813.csv'
>>> s.split('.')[0].split('_')[-1]
'35dbc3f813'
_(\w+)\.csv
正規表現は貪欲なパターンで機能し、パターンの一致を維持し、一致した最後のパターン(この場合は必要な文字列)を抽出します。
アンダースコア間の文字列の長さを気にしない正規表現は次のとおりです。
^.*?_.*?_.*?_(\w+)\..*$
一致する部分にはアンダースコアを含めることもできます(3番目のアンダースコアの後に一致します)。ドットは、3番目の下線の前に表示できます。
動作例を次に示します。http: //regex101.com/r/jT9fR0
入力文字列にアンダースコア文字が 3 つあると言いましたが、
1) _ 文字の間にいくつかの文字が存在することが確実な場合、正規表現は次のようになります。
.+?_.+?_.+?_(.+)\..+
2) そうでない場合、正規表現は次のようになります。
.*?_.*?_.*?_(.+)\..*
貪欲なオペレーターの後の疑問符は、オペレーターを消極的にします。