2015-04-22 14 views
14

, çok açık olduğunu:re.search() aynı şeyi ne zaman yapabilirse re.match() neden kullanılır? belgelerine

  • match() ->
  • search() dizesinin başında desen maçı uygulamak -> dize arama ve dönüş ilk maçı

Ve search, '^' ve re.M bayrağı olmadan, match ile aynı şekilde çalışır.

Peki python neden match() kullanıyor? Bu gereksiz değil mi? Python'da match()'u tutmak için herhangi bir performans avantajı var mı?

+1

Yaygın bir desen için bir kolaylıktır ve amacı daha net hale getirir. – Barmar

+0

Performans ölçütleri için [bu soru] bölümüne bakın (https://stackoverflow.com/questions/12803709/re-match-vs-re-search-performance-difference). 're.search' aslında bazen daha hızlı olabilir. – miradulo

+1

Olası kopyası: http://stackoverflow.com/questions/180986/what-is-the-difference-between-pythons-re-search-and-re-match –

cevap

4

cevap. Nitekim olarak, böyle fonksiyonu re.match() tanımlayabiliriz: (\A hep re.M bayrak status' bakılmaksızın dizesinin başında eşleştiği için)

def match(pattern, string, flags): 
    return re.search(r"\A(?:" + pattern + ")", string, flags) 

.

re.matchre.match yararlı bir kısayoldur, ancak kesinlikle gerekli değildir. Özellikle aramayı başlığına bağlayan ve dizgisini sonlandırmış olan Pattern.matches() numaralı Java programcıları için kafa karıştırıcıdır (muhtemelen başlangıçta yalnızca ankraj yapmaktan daha yaygın bir kullanım örneğidir).

Eric işaret ettiği gibi olsa da, nesneleri regex ait match ve search yöntemleri için farklı.

+1

_ işlevini tanımlayabiliyor olsanız bile, eşleme yönteminin modül düzeyinde eksik olması, tutarsız olur.Bu eşleşme, 'pos' argümanı ile kullanıldığında farklı bir sonuç verir (gerekliyse nereye götürdüğünüzü varsayarsak) – Eric

+0

@Eric: Modül düzeyinde * işlevler bir' pos' argümanına sahip değildir. Sadece regex nesnesinin yöntemleri (bu yüzden cevabınızı son satırda değindim). –

11

pos argüman önemli şekillerde farklı davranış gösterir:

>>> s = "a ab abc abcd" 
>>> re.compile('a').match(s, pos=2) 
<_sre.SRE_Match object; span=(2, 3), match='a'> 
>>> re.compile('^a').search(s, pos=2) 
None 

match mümkün bir dizgeciklerini yazmak ve karakterleri atlanır asla emin olmak için yapar. search'un "en erken izin verilen karakterden başlaması" şeklinde bir yolu yoktur. maçın

Örnek kullanımı hiçbir boşlukları olan bir dize kırmaya: sorular zor "Neden"

def tokenize(s, patt): 
    at = 0 
    while at < len(s): 
     m = patt.match(s, pos=at) 
     if not m: 
      raise ValueError("Did not expect character at location {}".format(at)) 
     at = m.end() 
     yield m 
+0

Bu, pattern.match() ve pattern.search() işlevleri için geçerli olabilir. 'Pos' argümanları olmayan re.match (patn, string, flags = 0) fonksiyonu için bu açıklama iyi değildir. @Tim işaret edildiği gibi, '^' kullanmak için programlayıcıya ihtiyaç duymayan kullanışlı bir kısayol olabilir. – elephant

+0

@mhr: – Eric

İlgili konular