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

我想提取字符串wwwqqqzzz。我如何做到這一點?用Python提取字符串re.match

也許有很多點,如:

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

在這種情況下,我基本上要由///界定的東西。我如何實現這一目標?

一個額外的問題:

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

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

似乎m.group(0)m.group(1)是相同的。

+0

你想從最終的字符串去掉點? – danseery

+0

是的,我只想純粹在//和/之間的字符[a-zA-Z] *之前'//'有一堆字符,在'/'結尾之後, – runcode

回答

35

match試圖匹配整個字符串。改爲使用search。那麼下面的模式將滿足您的要求

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

基本上,我們正在尋找/,然後使用盡可能多的非斜槓字符越好。和那些非斜槓字符將在組號碼被捕獲1.

事實上,有一個稍微更先進的技術,做同樣的,但不要求捕獲(其通常是耗時的)。它使用一個所謂的lookbehind

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

Lookarounds不包括在實際的比賽,因此所期望的結果。

該(或任何其他合理的正則表達式的溶液)將不會立即移除.秒。但是這可以很容易地在第二步完成:

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

這甚至不需要正則表達式。

當然,如果你想刪除除字母和數字(例如把www.regular-expressions.infowwwregularexpressionsinfo),那麼你最好使用的replace正則表達式版本的一切:

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

如何刪除這些點? – runcode

+1

對不起,我剛纔看到的要求。簡單地運行另一個步驟:( 「」 R 「」)''resultstr.replace。將在第二個包括。 –

+0

哦......聰明!謝謝! – runcode

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

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

雖然代碼可能會解決問題,但它本身並不是一個答案。你應該總是給它添加一個解釋。 – BDL