-1

文字列からURLを抽出する方法についてこのスレッドを読みました。https://stackoverflow.com/a/840014/326905本当にいいです、私はhttp://www.blabla.comを 含むXMLドキュメントからすべてのURLを取得しました

>>> s = '<link href="http://www.blabla.com/blah" />
         <link href="http://www.blabla.com" />'
>>> re.findall(r'(https?://\S+)', s)
['http://www.blabla.com/blah"', 'http://www.blabla.com"']

しかし、URLの最後にあるdoubleqouteを省略するように正規表現をカスタマイズする方法がわかりません。

最初はこれが手がかりだと思いました

re.findall(r'(https?://\S+\")', s)

またはこれ

re.findall(r'(https?://\S+\Z")', s)

しかし、そうではありません。

誰かが私を助けて、最後の二重引用符を省略する方法を教えてもらえますか?

ところで。httpsの「s」の後の疑問符は、「s」が発生する可能性があること、または発生しないことを意味します。私は正しいですか?

4

5 に答える 5

2
>>>from lxml import html
>>>ht = html.fromstring(s)
>>>ht.xpath('//a/@href')
['http://www.blabla.com/blah', 'http://www.blabla.com']
于 2013-03-21T15:09:25.613 に答える
1

私は以前、次のコードを使用してテキストからURLを抽出していました。

url_rgx = re.compile(ur'(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))')
# convert string to lower case
text = text.lower()
matches = re.findall(url_rgx, text)
# patch the 'http://' part if it is missed
urls = ['http://%s'%url[0] if not url[0].startswith('http') else url[0] for url in matches]
print urls

それは素晴らしい働きをします!

于 2013-03-21T14:46:31.547 に答える
1

すでに文字クラスを使用しています (省略版ではありますが)。先読みが必要ないように、文字クラスを少し変更することをお勧めします。文字クラスの一部として引用符を追加するだけです。

re.findall(r'(https?://[^\s"]+)', s)

これはまだ「空白ではない1つ以上の文字」と言っていますが、二重引用符も含めないという追加があります. したがって、全体的な表現は「空白で二重引用符でもない1 つまたは複数の文字」です。

于 2013-03-21T15:06:50.163 に答える
1

二重引用符を先読みとして表示する必要があります。

re.findall(r'(https?://\S+)(?=\")', s)

この方法では、それらはマッチの一部として表示されません。また、はい、?文字がオプションであることを意味します。

ここで例を参照してください: http://regexr.com?347nk

于 2013-03-21T14:42:49.150 に答える
0

ありがとう。これを読んだだけですhttps://stackoverflow.com/a/13057368/326905

これも機能していることを確認しました。

re.findall(r'"(https?://\S+)"', urls) 
于 2013-03-21T14:46:24.880 に答える