2013-02-18 15 views
8

ten jest napisany w Pythonie,Python wyrażenie regularne remix, dlaczego ten kod nie działa?

import re 
s='1 89059809102/30589533 IronMan 30 Santa Ana Massage table/IronMan 30 Santa Ana Massage table' 
pattern='\s(\d{11})/(\d{8})' 
re.match(pattern,s) 

zwraca żadnej.

próbowałem biorąc wsporniki off,

pattern='\s\d{11}/\d{8}' 

To wciąż powraca none.

Moje pytania są następujące:

  1. Dlaczego re.match nie znajdzie niczego?
  2. Jaka jest różnica ze wspornikiem we wzorze lub bez niego?
+0

@nhahtdh: ' \ s' i '\ d' nie mają znaczenia w normalnych ciągach Pythona, więc w tym konkretnym przypadku nie ma różnicy, a ukośniki odwrotne nie wymagają ucieczki. –

+0

@MartijnPieters: Masz rację, ale nieprzetworzony ciąg jest nadal bardzo przydatny, aby usunąć zamieszanie. Inny język ma inne traktowanie dla '' \ '', po którym następuje znak, który nie tworzy sekwencji unikowej. – nhahtdh

+1

@nhahtdh: Zgadzam się; używanie ciągów "r''' raw" do wyrażeń regularnych jest z pewnością świetnym pomysłem i jest najlepszą praktyką. Właśnie w tym przypadku OP ma szczęście i nie ma żadnej różnicy. :-) –

Odpowiedz

18

re.match "mecze" od początku napisu, ale jest dodatkowy 1.

Zamiast tego należy użyć re.search, która "wyszuka" w dowolnym miejscu ciągu. A w twoim przypadku też znaleźć coś:

>>> re.search(pattern,s).groups() 
('89059809102', '30589533') 

Jeśli usunąć wsporniki w strukturze, to będzie jeszcze powrócić poprawny _sre.SRE_Match, obiekt, ale z pustym groups:

>>> re.search('\s\d{11}/\d{8}',s).groups() 
() 
+1

To jest jasne wyjaśnienie. Rozumiem, co masz na myśli, dzięki! – bing

Powiązane problemy