2012-11-16 20 views
20
import re 
str="x8f8dL:s://www.qqq.zzz/iziv8ds8f8.dafidsao.dsfsi" 

str2=re.match("[a-zA-Z]*//([a-zA-Z]*)",str) 
print str2.group() 

current result=> error 
expected => wwwqqqzzz 

Voglio estrarre la stringa wwwqqqzzz. Come lo faccio?Estrai stringa con Python re.match

Forse ci sono un sacco di punti, come ad esempio:

"whatever..s#[email protected]:af//wwww.xxx.yn.zsdfsd.asfds.f.ds.fsd.whatever/123.dfiid" 

In questo caso, io fondamentalmente voglio la roba delimitata da // e /. Come lo realizzo?

Una domanda supplementare:

import re 
str="xxx.yyy.xxx:80" 

m = re.search(r"([^:]*)", str) 
str2=m.group(0) 
print str2 
str2=m.group(1) 
print str2 

Sembra che m.group(0) e m.group(1) sono gli stessi.

+0

vuoi puntini da rimuovere dalla stringa finale? – danseery

+0

sì, voglio solo caratteri [a-zA-Z] * tra // e /, prima che '//' abbia caratteri di gruppo, anche dopo '/' alla fine, – runcode

risposta

35

match tenta di far corrispondere l'intera stringa . Utilizzare invece search. Il seguente schema sarebbe quindi soddisfare le vostre esigenze:

m = re.search(r"//([^/]*)", str) 
print m.group(1) 

In sostanza, siamo alla ricerca di /, quindi consumare il maggior numero di caratteri non-slash possibile. E quei caratteri non-slash verranno catturati nel gruppo numero 1.

In effetti, esiste una tecnica leggermente più avanzata che fa lo stesso, ma non richiede la cattura (che è generalmente dispendiosa in termini di tempo). Esso utilizza un cosiddetto lookbehind:

m = re.search(r"(?<=//)[^/]*", str) 
print m.group() 

Lookarounds non sono inclusi nella partita attuale, quindi il risultato desiderato.

Questa (o qualsiasi altra soluzione di regex ragionevole) non rimuoverà immediatamente i . s. Ma questo può essere fatto facilmente in una seconda fase:

m = re.search(r"(?<=//)[^/]*", str) 
host = m.group() 
cleanedHost = host.replace(".", "") 

Che non richiede nemmeno le espressioni regolari.

Naturalmente, se si desidera rimuovere tutto tranne che per le lettere e le cifre (ad esempio, per trasformare www.regular-expressions.info in wwwregularexpressionsinfo) allora si sta meglio utilizzando la versione regex di replace:

cleanedHost = re.sub(r"[^a-zA-Z0-9]+", "", host) 
+1

come rimuovere i punti? – runcode

+1

scusa, ho appena visto quel requisito. semplicemente esegui un altro passaggio: 'resultstr.replace (r". "," ")'. Comprenderà quello in un secondo. –

+0

oh ... intelligente! Grazie! – runcode

3
print re.sub(r"[.]","",re.search(r"(?<=//).*?(?=/)",str).group(0)) 

Vedi this demo.

2
output=re.findall("(?<=//)\w+.*(?=/)",str) 

final=re.sub(r"[^a-zA-Z0-9]+", "", output [0]) 

print final 
-1
import re 
str="x8f8dL:s://www.qqq.zzz/iziv8ds8f8.dafidsao.dsfsi" 
re.findall('//([a-z.]*)', str) 
+0

Sebbene il codice possa risolvere il problema, non è una risposta a sé stante. Uno dovrebbe sempre aggiungere una spiegazione ad esso. – BDL

Problemi correlati