2009-04-19 15 views
79

"(. *)" Gibi bir python ifadesini nasıl yapabilirim? "A (b) c (d) e" python "b" yerine "b" ile eşleşir. "?Python olmayan açgözlü regex'ler

" [^)] "yerine". "Kullanabileceğimi biliyorum, ancak düzenli ifademi biraz daha temiz tutan daha genel bir çözüm arıyorum. Python'a "hey, bunu mümkün olan en kısa sürede eşleştir" demenin bir yolu var mı?

cevap

11

\\(.*?\\) eser olmaz mıydı? Bu açgözlü olmayan sözdizimi.

51
>>> x = "a (b) c (d) e" 
>>> re.search(r"\(.*\)", x).group() 
'(b) c (d)' 
>>> re.search(r"\(.*?\)", x).group() 
'(b)' 

According to the docs:

'*', '+' ve '?' kalifiye tüm hırslı; Mümkün olduğunca çok metinle eşleşiyorlar. Bazen bu davranış istenmez; RE <.*>, '<H1>title</H1>' ile eşleşiyorsa, yalnızca '<H1>' değil, tüm dizeyle eşleşecektir. Niteleyiciden sonra '?' ifadesini eklemek, oyunu açgözlü ya da minimal düzeyde gerçekleştirir; Mümkün olduğunca az sayıda karakter eşleştirilecektir. Önceki ifadede .*? kullanılması sadece '<H1>' ile eşleşecektir.

+1

[Normal ifadeyle HTML'yi ayrıştırmayın] (https://stackoverflow.com/a/1732454) –

2

"(b)" eşleşmesini istiyor musunuz? Zitrax ve Paolo'nun önerdiği gibi yap. "B" ile eşleşmesini istiyor musun? Bir ungreedy maç iyi bir başlangıç ​​kullanma

>>> x = "a (b) c (d) e" 
>>> re.search(r"\((.*?)\)", x).group(1) 
'b' 
2

yap, ama .* herhangi kullanımını yeniden gözden olması da öneririm - buna ne dersin?

groups = re.search(r"\([^)]*\)", x) 
5

Diğerleri de dediği gibi? * niceleyici üzerinde değiştirici, acil sorununuzu çözecektir, ancak dikkatli olun, regexlerin çalışmayı bıraktığı alanlara girmeye başlıyorsunuz ve bunun yerine bir ayrıştırıcıya ihtiyacınız var. Örneğin, "(foo (bar)) baz" dizesi size sorunlara neden olur.

İlgili konular