質問: 正規表現で特定文字列より前にマッチさせたいのですが、 その特定文字列が含まれない場合には、元の文字列にマッチさせるようにするには どうすればよいでしょうか。 抽出したい内容: "aaa"または"bbb"が対象に含まれる場合には、その前までの文字列、 含まれない場合には元の文字列、にマッチさせたいです。 やってみた正規表現: ``` "(.*?)(aaa|bbb).*" ``` これだと"aaa"または"bbb"を含む場合にはその前の文字列にマッチしますが、 "aaa"や"bbb"にもマッチしてしまうのと、 "aaa"や"bbb"を含まない場合には何にもマッチしません。
回答: コードの方をいじれるんなら、akira ejiriさんの回答で十分だと思います。 こちらは、コメントに「正規表現自体はソースの外出し」と言うことですので、使う正規表現によって、コードの方をいじったりはできず、正規表現のマッチする範囲自体が切り出したい文字列になっていないといけない、と言う想定での回答になります。 ``` import re a = "AAAaaaZZZ" b = "AAAbbbZZZ" c = "AAAcccZZZ" pattern = "(.*?)(?=aaa|bbb|$)" print(re.match(pattern, a).group(0)) print(re.match(pattern, b).group(0)) print(re.match(pattern, c).group(0)) ``` 実行例 ``` AAA AAA AAAcccZZZ ``` マッチに使用しているコードによっては、若干書き換える必要があるかもしれませんが、 * "aaa"や"bbb"にもマッチしてしまう →(metropolisさんのコメントにあるように)肯定的先読み`(?=〜)`が使える * "aaa"や"bbb"を含まない場合には何にもマッチしません →対象の"aaa"、"bbb"に加え、終端を表す`$`を同じ並びに入れてやる と言う形で解決しています。