web-dev-qa-db-ja.com

Python re.matchで文字列を抽出します

_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を抽出したい。どうやってやるの?

次のような多くのドットがあるかもしれません。

_"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)は同じようです。

22
runcode

matchは、entire文字列との一致を試みます。代わりにsearchを使用してください。次のパターンが要件に一致します。

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

基本的に、/を探してから、できるだけ多くの非スラッシュ文字を消費します。そして、これらの非スラッシュ文字はグループ番号1でキャプチャされます。

実際、同じことを行う少し高度なテクニックがありますが、キャプチャは必要ありません(一般的に時間がかかります)。いわゆる lookbehind を使用します。

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

ルックアラウンドは実際の一致には含まれないため、望ましい結果になります。

これ(またはその他の合理的な正規表現ソリューション)は、.sをすぐに削除しません。ただし、これは2番目のステップで簡単に実行できます。

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)
38
Martin Ender
print re.sub(r"[.]","",re.search(r"(?<=//).*?(?=/)",str).group(0))

このデモを参照してください。

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

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

print final
2
John F