web-dev-qa-db-ja.com

Python正規表現の先読みと先読み

文字列からの文字列 "foo"を次の形式に一致させる必要があります。

string = "/foo/boo/poo"

私はこのコードを結びました:

poo = "poo"
foo = re.match('.*(?=/' + re.escape(poo) + ')', string).group(0)

そして、変数fooのコンテンツとして/foo/booを(foo/booだけではなく)与えます。

私はこのコードを試しました:

poo = "poo"
foo = re.match('(?=/).*(?=/' + re.escape(poo) + ')', string).group(0)

同じ出力が得られます(/foo/booではなくfoo/boo)。

foo/boo部分のみを一致させるにはどうすればよいですか?

6
John Ellis

次の正規表現を試してください:

(?<=/).*(?=/poo)
^^^^^^

結果の最初のスラッシュは考慮されません。

テスト済みregex101https://regex101.com/r/yzMkTg/1

次の方法でコードを変換すると、機能するはずです。

poo = "poo"
foo = re.match('(?<=/).*(?=/' + re.escape(poo) + ')', string).group(0)

Positive lookaheadおよびPositive lookbehindの動作の詳細については、このリンクをざっと見てください。

http://www.rexegg.com/regex-quickstart.html

3
Allan

後読みに<がありません!

後読みは次のようになります。

(?<=...)

このようではない:

(?=...)

それは一見でしょう先に

そう、

(?<=/).*(?=/poo)
6
Sweeper