Python re.findall と re.search には同じ正規表現がありますが、ルールが異なるのはなぜですか? ?

今日問題が発生しました。Python の re.findall と re.search を使用する過程で、次のコードのように、同じ式でもパフォーマンスが同じではない奇妙なことを発見しました。

s = "gpdk090_nmos1v #(.w(1.5e-6), .l(2.8e-07), .as(9e-13), .ad(4.5e-13), .ps(4.2e-06), .pd(2.1e-06), .m((1)*(2)))"
r1 = "#\((.*?\(.*?\)){0,}\)"
res = re.findall(r1, s)
res1 = re.search(r1,s).group()
print res, res1
'''
输出的结果分表示
res = ['*(2)']
res1 = #(.w(1.5e-6), .l(2.8e-07), .as(9e-13), .ad(4.5e-13), .ps(4.2e-06), .pd(2.1e-06), .m((1)*(2))
'''

res1 は私が望む結果であり、しばらく理由を確認したところ、キャプチャ グループ (xxx) と非キャプチャ グループ (?:xxx) の使用に 2 つの違いがあることがわかりました。 .search は非キャプチャ メソッドを使用し、re. findall はキャプチャ メソッドを使用します。特定の理由については、公式の説明を確認できます
。re.findall ソリューションを使用するには、
正規表現が次のように変更されます: r1 = "#((?: . ?(. ?)){0,})", 次に、要件を満たすすべての部分文字列と一致させることができます。

30 分で正規表現を学ぶにはここをクリックしてください。この記事は非常に役立ちます

さあ、労働者を殴ってください!

おすすめ

転載: blog.csdn.net/qq_41841073/article/details/131712931