Newsgroup: it.comp.os.linux.development
Titolo: RegEx per detettare una url

Sto cercando di costruire una regex che mi matchi le url, inoltre
dovrebbe matcharmi solo la url e non eventuali parentesi in cui è
racchiusa, virgole o cose del genere.
Quindi ad esempio nei casi
(
http://url.prova.it
)
http://url.prova.it
,
mi deve restituire 
http://url.prova.it
Il problema è che i caratteri che voglio eliminare sono cmq anche
ammessi nel corpo della url quindi (vista la mia scarsa conoscenza delle
RE) non riesco a fare in modo di non considerarli solo se sono alla fine
della stringa.
Ho provato con una cosa del genere (uso Python):
(https?://[-a-zA-Z0-9_$.+!*(),;:@%&=?~#'/]*)(?=[:;.,\])]|$)
dove mi vado a prendere solo il primo gruppo, ma cmq le eventuali
parentesi virgole vengono prese. 
Come posso migliorare questa RE?
-- 
The lab called! your brain is ready.
 
 |\ |       |HomePage   : 
http://nem01.altervista.org
 | \|emesis |XPN (my nr): 
http://xpn.altervista.org

 
non capisco come vuoi levare quella virgola.. è un pezzo valido dell'url :/
cmq sicuro che dentro urllib nn ci sia un metodo extract o qualcosa del 
genere?

 genere?
Dovrei riguardamelo meglio, ma a suo tempo ho gia dato un'occhiata ad
urllib, e mi pare serva esclusivamente per il retrieving.
-- 
Never go to a doctor who's office plants have died.


 urllib, e mi pare serva esclusivamente per il retrieving.
E urlparse l'hai guardata? :))
Comunque prova anche urllib2, e in generale altre librerie che 
lavorano in rete/html e simili...
Magari e` un po' sparsa... ma IMHO urlparse puo` fare al caso tuo.
Spezzetti la url, e poi lavori solo sui pezzi, in questo modo la 
pappardella inquietante (non mi viene in mente nulla di meglio 
per definire la regex di prima) si dovrebbe semplificare anzicheno` :))
-- 
RiK0
[ non credo negli schemi non vincenti ]
[     two is an odd prime number.     ]

>> urlparse.urlparse("
http://prova.it
)")
('http', '
prova.it
)', '', '', '', '')
Non ci siamo, il problema è sempre quello, devo eliminare quella
parentesi (o la virgola o quello che è) dalla fine della url anche se
all'interno tale carattere è ammesso. :-/
-- 
Life is too important to be taken seriously.


 all'interno tale carattere è ammesso. :-/
Yes, ma ti porti dietro regex piu` facili.
e poi ricomponi tutto.
-- 
RiK0
Non credo negli schemi non vincenti.

 all'interno tale carattere è ammesso. :-/
Bene, allora una volta ottenuto il risultato vai a controllare se l'ultimo 
carattere è uno di quelli "proibiti", e nel caso lo rimuovi.
Non so programmare in Python (non ancora:-), ma non credo sia impossibile.
Puoi anche usare qualche semplice regex per farlo, credo.
Daniele

 la virgola non fa mica parte della url.
no, ma se fosse:
http://www.foo.com/
,
ne farebbe parte (o meglio potrebbe farne secondo rfc, difficile in 
pratica )

 Puoi anche usare qualche semplice regex per farlo, credo.
Io quella volevo, anche perchè mi avrebbe snellito il codice, ma con le
regex non sono una cima :-/
-- 
I love cats.. They taste just like chicken.


 pratica )
Appunto, io mi baso sul fatto che uno di quei caratteri difficilmente
farà parte della url come ultimo carattere, ma è molto più probabile che
faccia parte del testo in cui la url è inserita e quindi va tolto.
Ovviamente ogni tanto potrò sbagliare, ma nella maggior parte dei casi
ci avrò azzecato.
-- 
X-Newsreader: Certanly not Microsoft Outlook Express


> Se io scrivo: trovate XPN su 
http://xpn.altervista.org
, ad ogni modo bla
-- 
Bigamy is having one wife too many. Monogamy is the same.


>>Se io scrivo: trovate XPN su 
http://xpn.altervista.org
, ad ogni modo bla
Ho dato un'occhiata veloce ai docs di python, e ho provato a modificare un attimo le
istruzioni di Gabriele. Prova cosě:
 >>> tua=re.compile("https?://[\w$.+!*(),;:@%&=?~#'/]*[\w$.+!*(@%&=?~#'/]")
 >>> print '"'+tua.search("e quindi su 
http://ciao.com
, ").group()+'"'
"
http://ciao.com
"
 >>> print '"'+tua.search("e quindi su 
http://ciao.com
 ").group()+'"'
"
http://ciao.com
"
 >>> print '"'+tua.search("e quindi su 
http://ciao.com
").group()+'"'
"
http://ciao.com
"
 >>> print '"'+tua.search("Se io scrivo: trovate XPN su 
http://xpn.altervista.org
, ad ogni modo bla").group()+'"'
"
http://xpn.altervista.org
"
In pratica ho usato search al posto di match e un gruppo con tutti i caratteri tranne quelli proibiti
al posto di uno con quelli proibiti negati (altrimenti lui piglia tutti i caratteri piů
lo spazio alla fine, che chiaramente non č tra quelli proibiti).
Sembra funzionare...
Daniele

 Sembra funzionare...
In effetti sembra funzionare, devo fare qualche piccolo tuning con i
caratteri ammessi (non mi ha preso il -) ma sembrerebbe andare. In ogni
caso io uso finditer non match, quindi il problema non era quello.
-- 
Crime doesn't pay... does that mean my job is a crime?


 caso io uso finditer non match, quindi il problema non era quello.
OK, confermo, questa versione:
RE_url=r"(https?://[-a-zA-Z0-9_$.+!*(),;:@%&=?~#'/]*[-a-zA-Z0-9_$+!*(@%&=?~#/])"
sembra funzionare bene in tutti i casi. :-)
-- 
I'm not fat! - just gravitationally challenged.


 
mi scuso per l'assenza dalla discussione :)
cmq mi chiedo: perché usi il (?=) per matchare /corviso/ etc?
Non bastava un regexp nn greedy?
 >>> r=compile(r'\*.*?\*')
 >>> for i in r.finditer('questo *dovrebbe* essere *sufficente*'):
...  print i.group(0)
...
*dovrebbe*
*sufficente*

 *sufficente*
Hmmm mbo? Farò qualche prova.
-- 
Early to rise and ditto to bed, makes you socially dead.
