2009-12-31 8 views
5

Python’da çalışmak için bu new way to recognise adreslerini yeniden yazabilir miyim? Ben piton sanmıyorumGruber’in URL'si Python’da Normal Düzenleme

\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))

+0

Hangi kısım çalışmıyor? –

+0

Neden kodunuzu soruya koymuyorsunuz, başarısız olan örneklerle –

+0

@vanity, Unicode karakter özelliklerine sahip yanıt çalışmaz. Http://stackoverflow.com/questions/1832893/python-regex-matching-unicode-properties adresine bakın. –

cevap

12

bunun için original source devletler için ASCII eşdeğerdir ve özellikle Perl "Bu model en modern regex uygulamalarda çalışmalıdır". Python'un normal ifadesi modern ve similar to Perl's ancak [:punct:] karakter sınıfında eksik. Kolayca bu kullanarak bu inşa edebilirsiniz: karakteri as required set içindeki

>>> import string, re 
>>> pat = r'\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^%s\s]|/)))' 
>>> pat = pat % re.sub(r'([-\\\]])', r'\\\1', string.punctuation) 

re.sub() çağrı belirli karakterleri kaçar.

Düzenleme: sadece her şeyi önünde bir ters eğik çizgi yapışır beri re.escape Kullanma(), da iyi çalışır. Bu ilk başta bana kaba davrandı, ama kesinlikle bu dava için iyi çalışıyor.

>>> pat = pat % re.escape(string.punctuation) 
+0

Bu, Gruber'in tüm testlerini geçer, çünkü pat = pat% re.escape (string.punctuation) – Tobias

+0

@vanity'nin de belirtildiği gibi güncellenir. Unicode, eğer veri kaynağınız Unicode ise string.punctuation gibi saf bir ASCII çözümü kusurlu sonuçlar verebilir. –

+0

ASCII olmayan etki alanları ve yolları ile çalışır. İngilizce olmayan noktalama işareti olan test verilerim yok. – Tobias

5

POSIX bracket expressions yok

[-!\"#$%&\'()*+,./:;<=>[email protected]\\[\\\\]^_`{|}~] 
+0

Wikipedia yanlış. Http://www.regular-expressions.info/posixbrackets.html adresine göre caret eksik. –

+0

Tamam, şimdi doğru. Lütfen cevabınızı güncelleyin. –

+0

Evet, Gönderdiğim yazı güncellendi, Teşekkürler. Birisi de Wikipedia'yı güncelledi. Harika! – YOU

2

Python için

[:punct:] 

Wikipedia[:punct:] aynıdır diyor bu ifadeyi var.

[:punct:] braket ifadesi

[!"#$%&'()*+,\-./:;<=>[email protected][\\\]^_`{|}~] 
+0

Ters eğik çıkışlar tersi doğru olmayacağından, bunu kullanırken "ham" bir dize ("r" ile önek) kullandığınızdan emin olun. –

+0

Ayrıca, Python'un bu Unicode karakter özelliklerini desteklemediğini de unutmayın: http://stackoverflow.com/questions/1832893 –

+0

Gerçekten de derlerler, ancak beklediğinizi yapmazlar – Tobias