-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"']

但我不知道如何自定义正则表达式以省略网址末尾的双引号。

首先我认为这是线索

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

您希望双引号显示为前瞻:

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

这样他们就不会出现在比赛中。另外,是的,这?意味着该字符是可选的。

请参阅此处的示例:http ://regexr.com?347nk

于 2013-03-21T14:42:49.150 回答
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)

这仍然说“一个或多个字符不是空格”,但也添加了不包括双引号。所以整体表达是“一个或多个字符不是空格也不是双引号”。

于 2013-03-21T15:06:50.163 回答
0

谢谢。我刚刚读到这个​​https://stackoverflow.com/a/13057368/326905

并检查了这个也有效。

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