Saya sedang membuat aplikasi di Google App Engine. Saya sangat baru mengenal Python dan telah mengatasi masalah berikut selama 3 hari terakhir.
Saya memiliki kelas untuk mewakili RSS Feed dan di kelas ini saya memiliki metode yang disebut setUrl. Masukan untuk metode ini adalah URL.
Saya mencoba menggunakan modul re python untuk memvalidasi RFC 3986 Reg-ex ( http://www.ietf.org/rfc/rfc3986.txt )
Di bawah ini adalah potongan yang seharusnya berfungsi?
p = re.compile('^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?')
m = p.match(url)
if m:
self.url = url
return url
python
regex
google-app-engine
Zee Spencer
sumber
sumber
urlparse
modul diubah namanya menjadiurllib.parse
Python 3. Periksa docs.python.org/3.7/library/…Jawaban:
Cara mudah untuk mengurai (dan memvalidasi) URL adalah modul
urlparse
( py2 , py3 ).Regex terlalu merepotkan.
Tidak ada metode "validasi" karena hampir semua adalah URL yang valid. Ada beberapa aturan tanda baca untuk memisahkannya. Tanpa tanda baca apa pun, Anda masih memiliki URL yang valid.
Periksa RFC dengan cermat dan lihat apakah Anda dapat membuat URL yang "tidak valid". Aturannya sangat fleksibel.
Contohnya
:::::
adalah URL yang valid. Jalannya adalah":::::"
. Nama file yang cukup bodoh, tetapi nama file yang valid.Juga,
/////
merupakan URL yang valid. Netloc ("hostname") adalah""
. Jalannya adalah"///"
. Sekali lagi, bodoh. Juga valid. URL ini menormalkan"///"
mana yang setara.Sesuatu seperti
"bad://///worse/////"
itu sangat valid. Bodoh tapi valid.Intinya . Parse, dan lihat potongannya untuk melihat apakah ada yang tidak menyenangkan.
Apakah Anda ingin skema selalu "http"? Apakah Anda ingin netloc selalu menjadi "www.somename.somedomain"? Apakah Anda ingin jalur terlihat seperti unix? Atau seperti jendela? Apakah Anda ingin menghapus string kueri? Atau melestarikannya?
Ini bukan validasi yang ditentukan RFC. Ini adalah validasi unik untuk aplikasi Anda.
sumber
urlparse
kebutuhan harus ditambah dengan regex untuk memvalidasi netloc (atau bagian lain) terhadap standar tertentu.urlparse({})
ketika input bahkan bukan string berhasil tanpa kesalahan yang terlihatBerikut regexp lengkap untuk mengurai URL.
Mengingat kerumitannya, saya pikir Anda harus menggunakan cara urlparse.
Untuk kelengkapannya berikut ini pseudo-BNF dari regex diatas (sebagai dokumentasi):
sumber
Saya menggunakan yang digunakan oleh Django dan tampaknya bekerja dengan cukup baik:
Anda selalu dapat memeriksa versi terbaru di sini: https://github.com/django/django/blob/master/django/core/validators.py#L74
sumber
Saya akui, saya menemukan ekspresi reguler Anda sama sekali tidak bisa dimengerti. Saya ingin tahu apakah Anda bisa menggunakan urlparse? Sesuatu seperti:
Mungkin lebih lambat, dan mungkin Anda akan melewatkan ketentuan, tetapi (bagi saya) tampaknya jauh lebih mudah untuk dibaca dan di-debug daripada ekspresi reguler untuk URL .
sumber
urlparse
modul diubah namanya menjadiurllib.parse
Python 3. Periksa docs.python.org/3.7/library/…urlparse
dengan senang hati mengambil URL yang tidak valid, ini lebih merupakan pustaka pemisah string daripada jenis validator apa pun. Sebagai contoh:Bergantung pada situasinya, ini mungkin baik-baik saja ..
Jika Anda sebagian besar mempercayai data, dan hanya ingin memverifikasi protokolnya adalah HTTP, maka
urlparse
itu sempurna.Jika Anda ingin membuat URL sebenarnya adalah URL legal, gunakan regex konyol
Jika Anda ingin memastikan itu adalah alamat web yang sebenarnya,
sumber
"http://----"
?? Ini adalah url yang sangat valid! Cukup setel nama host Anda ke "----" dan Anda sudah dapat menggunakannya!http://pypi.python.org/pypi/rfc3987 memberikan ekspresi reguler untuk konsistensi dengan aturan di RFC 3986 dan RFC 3987 (yaitu, bukan dengan aturan khusus skema).
Sebuah regexp untuk IRI_reference adalah:
Dalam satu baris:
sumber
catatan - Lepl tidak lagi dipelihara atau didukung.
RFC 3696 mendefinisikan "praktik terbaik" untuk validasi URL - http://www.faqs.org/rfcs/rfc3696.html
Rilis terbaru Lepl (pustaka parser Python) menyertakan implementasi RFC 3696. Anda akan menggunakannya seperti:
Meskipun validator ditentukan di Lepl, yang merupakan pengurai keturunan rekursif, validator sebagian besar dikompilasi secara internal ke ekspresi reguler. Itu menggabungkan yang terbaik dari kedua dunia - definisi (yang relatif) mudah dibaca yang dapat diperiksa dengan RFC 3696 dan implementasi yang efisien. Ada posting di blog saya yang menunjukkan bagaimana ini menyederhanakan pengurai - http://www.acooke.org/cute/LEPLOptimi0.html
Lepl tersedia di http://www.acooke.org/lepl dan modul RFC 3696 didokumentasikan di http://www.acooke.org/lepl/rfc3696.html
Ini benar-benar baru dalam rilis ini, jadi mungkin mengandung bug. Silakan hubungi saya jika Anda memiliki masalah dan saya akan memperbaikinya secepat mungkin. Terima kasih.
sumber
Saat ini, dalam 90% kasus jika Anda bekerja dengan URL dengan Python, Anda mungkin menggunakan permintaan-python. Oleh karena itu pertanyaannya di sini - mengapa tidak menggunakan kembali validasi URL dari permintaan?
Fitur:
sumber
Regex yang diberikan harus cocok dengan url apa pun dengan format http://www.ietf.org/rfc/rfc3986.txt ; dan melakukannya saat diuji di interpreter python.
Format apa yang dimiliki URL yang mengalami kesulitan dalam mengurai?
sumber
Saya harus melakukan ini berkali-kali selama bertahun-tahun dan selalu berakhir dengan meniru ekspresi reguler orang lain yang telah memikirkannya lebih dari yang saya inginkan .
Karena itu, ada regex dalam kode bentuk Django yang harus melakukan trik:
http://code.djangoproject.com/browser/django/trunk/django/forms/fields.py#L534
sumber
regex validasi url django yang dimodifikasi:
sumber: https://github.com/django/django/blob/master/django/core/validators.py#L74
sumber
CATATAN: Seburuk yang terlihat di browser Anda, cukup salin tempel dan pemformatannya harus bagus
Ditemukan di milis python dan digunakan untuk gnome-terminal
sumber: http://mail.python.org/pipermail/python-list/2007-January/595436.html
sumber