2012-11-16 3 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" 

、私は基本的に///で囲まれたものが欲しいです。どのように達成するのですか?

1つの追加の質問:

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() 

前後参照は、従って、実際の試合、所望の結果には含まれません。

この(または他の合理的な正規表現の解決策)はすぐに.を削除しません。しかし、これは簡単に2番目のステップで行うことができます:

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

これは正規表現を必要としません。もちろん

、あなたが(例えばwwwregularexpressionsinfowww.regular-expressions.infoをオンにする)文字と数字以外のすべてのものを削除したい場合、あなたはreplaceの正規表現のバージョンを使用したほうが良いです:

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

どのようにドットを削除するのですか? – runcode

+1

申し訳ありませんが、私はその要件を見ました。別のステップを実行するだけです: 'resultstr.replace(r"。 "、" ")'。それを2番目に入れる予定です。 –

+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

コードは問題を解決するかもしれませんが、それはそれ自身の答えではありません。 1つは常にそれに説明を加えるべきです。 – BDL

関連する問題