2009-03-03 11 views
1

Ben şu kod: piton regex sorun

what = re.match("get|post|put|head\s+(\S+) ",data,re.IGNORECASE)

ve verilerinde

değişken ı bu satırı var diyelim: Ben ayıklayıcısında senaryoyu durursa

GET some-site.com HTTP/1.0 ...

ve 'un değişkenini inceleyerek, sadece eşleşen GET'i görebiliyorum. Neden bazı siteyle eşleşmiyor?

cevap

3
 

>>> re.match("(get|post|put|head)\s+(\S+) ",'GET some-site.com HTTP/1.0 ...',re.IGNORECASE).groups() 
('GET', 'some-site.com') 
>>>                       
 
+0

Çalışıyor, ancak sürümümün neden çalışmadığını açıklayabilir misiniz? Sadece ikinci kelimeyi yakalamak istiyorum. .group (1) 'i arayarak erişebileceğimi biliyorum, ancak sürümümün neden çalışmadığına şaşıyorum. – Geo

+0

"Neden 1 + 2 + 3 + 4 * 100 406 ve 1000 değil"? http://www.amk.ca/python/howto/regex/regex.html#SECTION000510000000000000000. "|" Hakkında bilgi edinin karakter ve önceliği. – tzot

4

Regex dil operatör öncelik 4 alternatif olarak head\s+(\S+) koyar. @Mykola Kharechko 'un parantezindeki parantez, 4. alternatif olarak head' u düzenler ve \s+(\S+) grubu, grubun hangi alternatifle eşleştiğine eklenir.

1

+1 Mykola'nın yanıtı ve gimel'in açıklaması. Ayrıca, bunun için normal ifadeyi kullanmak ister misiniz? Gördüğünüz gibi, göründükleri kadar basit değiller. Normal olmayan bir yöntem şu şekildedir:

def splitandpad(s, find, limit): 
    seq= s.split(find, limit) 
    return seq+['']*(limit-len(seq)+1) 

method, path, protocol= splitandpad(data, ' ', 2) 
if method.lower() not in ('get', 'head', 'post', 'put'): 
    # complain, unknown method 
if protocol.lower() not in ('http/1.0', 'http/1.1'): 
    # complain, unknown protocol 
+0

Evet, ayrık kullanabileceğimi biliyorum. Bir regex ile başladım ve sonra işe yaramadı kızdım :) – Geo