正規表現でマッチしない場合には元の文字列にマッチさせたい


正規表現で特定文字列より前にマッチさせたいのですが、  
その特定文字列が含まれない場合には、元の文字列にマッチさせるようにするには  
どうすればよいでしょうか。

抽出したい内容：  
"aaa"または"bbb"が対象に含まれる場合には、その前までの文字列、  
含まれない場合には元の文字列、にマッチさせたいです。

やってみた正規表現：

[code]

    "(.*?)(aaa|bbb).*"
    
[/code]

これだと"aaa"または"bbb"を含む場合にはその前の文字列にマッチしますが、  
"aaa"や"bbb"にもマッチしてしまうのと、  
"aaa"や"bbb"を含まない場合には何にもマッチしません。




**回答**  
`re.sub`で終了文字列パターン以降を空文字列に置換したものが抽出結果です。  
終了文字列パターンにマッチした文字列だけが削除(空文字列で置換)されますので、マッチしなければ元の文字列が得られます。

**コード**

[code]

    def extract(str, patern):
        import re
        return re.sub(patern, "", str)
    
[/code]

**呼び出しコード**

[code]

    終了文字列パターン = "(aaa|bbb).*"
    対象文字列1 = "AAAaaaZZZ"
    対象文字列2 = "AAAbbbZZZ"
    対象文字列3 = "AAAcccZZZ"
    print("対象文字列1=[" + str(対象文字列1) + "]")
    print("対象文字列2=[" + str(対象文字列2) + "]")
    print("対象文字列3=[" + str(対象文字列3) + "]")
    
    結果1 = extract(対象文字列1, 終了文字列パターン)
    print("結果1=[" + str(結果1) + "]")
    
    結果2 = extract(対象文字列2, 終了文字列パターン)
    print("結果2=[" + str(結果2) + "]")
    
    結果3 = extract(対象文字列3, 終了文字列パターン)
    print("結果3=[" + str(結果3) + "]")
    
[/code]

**結果**

[code]

    終了文字列パターン=[(aaa|bbb).*]
    対象文字列1=[AAAaaaZZZ]
    対象文字列2=[AAAbbbZZZ]
    対象文字列3=[AAAcccZZZ]
    結果1=[AAA]
    結果2=[AAA]
    結果3=[AAAcccZZZ]
    
[/code]

