2012-11-16 9 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 

Chcę wyodrębnić ciąg wwwqqqzzz. Jak ja to robię?Wyodrębnij ciąg znaków w rozmowie Python

Może istnieje wiele punktów, takich jak:

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

W tym przypadku Chcę zasadniczo rzeczy ograniczony // i /. Jak to osiągnąć?

Jedno dodatkowe pytanie:

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

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

Wydaje się, że m.group(0) i m.group(1) są takie same.

+0

chcesz kropki zostać usunięte z ostatecznej ciąg? – danseery

+0

tak, chcę tylko czystych znaków [a-zA-Z] * pomiędzy // i /, przed "//" ma kilka znaków, również po "/" na końcu, – runcode

Odpowiedz

35

match próbuje dopasować ciąg znaków cały. Zamiast tego użyj search. Poniższy wzór by następnie dopasować swoje wymagania:

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

Zasadniczo szukamy /, potem konsumować tyle znaków non-slash, jak to możliwe. A te niezatarte znaki zostaną przechwycone w grupie 1.

W rzeczywistości istnieje nieco bardziej zaawansowana technika, która robi to samo, ale nie wymaga przechwytywania (co jest zazwyczaj czasochłonne). Wykorzystuje tzw lookbehind:

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

Lookarounds nie są uwzględniane w rzeczywistym meczu, stąd pożądanego rezultatu.

To (lub inne rozsądne rozwiązanie) nie usuwa natychmiast . s. Ale można to łatwo zrobić w drugim etapie:

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

To nie wymaga nawet wyrażeń regularnych.

Oczywiście, jeśli chcesz, aby usunąć wszystko z wyjątkiem liter i cyfr (np włączyć www.regular-expressions.info do wwwregularexpressionsinfo) to jesteś lepiej wyłączyć za pomocą wersji regex z replace:

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

jak usunąć kropki? – runcode

+1

Przepraszam, właśnie zobaczyłem ten wymóg. po prostu wykonaj kolejny krok: 'resultstr.replace (r". "," ")'. Włączą to w sekundę. –

+0

oh ... sprytny! Dzięki! – runcode

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

Zobacz 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

Mimo że kod może rozwiązać problem, sam nie jest odpowiedzią. Zawsze należy dodać do niego wyjaśnienie. – BDL

Powiązane problemy