1

特定の文字ブロックが文字列の後半に存在するかどうかに基づいて、文字列の先頭を異なる方法で一致させたいと考えています。これの非常に単純化されたバージョンは次のとおりです。

re.search("""^(?(pie)a|b)c.*(?P<pie>asda)$""", 'acaaasda')

が一致する場合は文字列の先頭<pie>に表示し、一致しない場合は を表示します。ab

通常の数値先読みを使用しますが、これら 2 つの間で一致するグループと一致しないグループの数は保証されません。

私は現在取得していerror: unknown group nameます。私の腸の沈んだ感覚は、これは私が望んでいることは不可能だからだと教えてくれます (名前付きグループの先読みは、通常の言語パーサーの機能ではありません)。 4 時間か 5 時間分の正規表現の書き込みを破棄し、明日再帰降下パーサーか何かとしてすべてやり直します。

助けてくれてありがとう。

4

2 に答える 2

4

残念ながら、名前付きグループでやりたいことを行う方法はないと思います。重複をあまり気にしない場合は、共有条件とOR式を一緒に複製できます。

^(ac.*asda|bc.*)$

複雑な式の場合は、共有部分をコピーして貼り付けるのではなく、常に文字列の書式設定を使用して共有できます。

common_regex = "c.*"
final_regex = "^(a{common}asda|b{common})$".format(common=common_regex)
于 2013-07-10T06:01:11.403 に答える