2013-09-30 17 views
6

Próbuję dostać 482.75 z następującym tekstem: <span id="yfs_l84_aapl">482.75</span>Co [^.] * Oznacza w wyrażeniu regularnym?

regex użyłem to: regex = '<span id="yfs_l84_[^.]*">(.+?)</span>' i to działało.

Ale nie rozumiem, dlaczego [^.] * Może pasować do aapl tutaj? Moje zrozumienie jest takie. oznacza dowolną postać, z wyjątkiem nowej linii; i^oznacza negator. Zatem [^.] Powinno być znakiem nowej linii, a [^.] * Powinno być dowolną liczbą nowych linii. Ta teoria jest jednak sprzeczna z rzeczywistą implementacją.

Każda pomoc jest doceniana i z góry dziękuję.


Kod pyton użyłem:

import urllib 
import re 
htmlfile = urllib.urlopen("http://finance.yahoo.com/q?s=AAPL&ql=0") 
htmltext = htmlfile.read() 
regex = '<span id="yfs_l84_[^.]*">(.+?)</span>' 
pattern = re.compile(regex) 
price = re.findall(pattern, htmltext) 
print "the price of of aapl is", price[0] 

Odpowiedz

18

W []. oznacza tylko kropkę. A wiodący ^ oznacza "wszystko oprócz ...".

Tak więc [^.]* dopasowuje zero lub więcej non-kropek.

+2

Dokumentacja Pythona mówi nawet bardzo wyraźnie: [znaki specjalne tracą specjalne znaczenie w zestawach] (http://docs.python.org/2/library/re.html#regular-expression-syntax). – Evert

+0

to nie oznacza, dlaczego pasuje do 'aapl' – Anirudha

+7

@Airirh: Tak, to prawda. –

2

. kropka w znaku-matcheru oznacza po prostu kropkę, dosłownie.

Różne składni i znaki specjalne (- myślnik dla zakresu,^dla negacji) mają zastosowanie w specyfikacji dopasowywania znaków. Inne składni wzoru nie mają zastosowania.

Powiązane problemy