*
正規表現での記号の意味について誤解しているようです。「何にでも合う」という意味ではなく、「前のことを0回以上繰り返す」という意味です。
*
任意の文字列に一致させるには、任意の 1 文字に一致すると組み合わせる必要があります.
(これについては後で詳しく説明します)。パターン.*
は、0 個以上の文字の任意の文字列に一致します。
したがって、パターンを に変更すると.*abc(.*)xyz
、ほとんどの場合、そこに到達できます。ただし、接頭辞と接尾辞がテキスト内に 1 つしか存在しない場合、先頭.*
は不要です。abc
これを省略して、プレフィックスの前にある一致しない文字をスキップする処理を正規表現エンジンに任せることができます。
残っている 1 つの問題は、ソース テキストに複数行のテキストがあることです。上記で.
パターンが文字に一致すると述べましたが、それは完全に真実ではありません。デフォルトでは、改行には一致しません。重要ではない単一行のテキストの場合、ここで問題が発生します。その動作を変更するには、フラグre.DOTALL
(またはその短いスペル) をorre.S
の 3 番目の引数として渡します。このフラグは、パターンが改行を含む任意の文字と一致することを許可するように正規表現システムに指示します。re.findall
re.search
.
したがって、現在のコードを機能するシステムに変える方法は次のとおりです。
import re
def find_between(prefix, suffix, text):
pattern = r"{}.*{}".format(re.escape(prefix), re.escape(suffix))
result = re.search(pattern, text, re.DOTALL)
if result:
return result.group()
else:
return None # or perhaps raise an exception instead
あなたのコメントは、接頭辞と接尾辞の間の部分だけでなく、一致したテキスト全体を取得したいことを示唆していたので、パターンを少し単純化しました。