【问题标题】:Python Regex over list of stringsPython正则表达式超过字符串列表
【发布时间】:2016-04-29 19:07:26
【问题描述】:

我正在尝试从字符串列表中提取 url。样品清单:

import re
p = ['<img class="alignnone size-full wp-image-2087" src="http://www.sample.com/test.jpg" alt="0wCR41v" width="540" height="720" srcset="http://www.sample.com/test-225x300.jpg 225w, http://www.sample.com/test.jpg 540w" sizes="(max-width: 540px) 100vw, 540px" />', '<img class="alignnone size-large wp-image-2133" src="http://www.sample.com/test2.jpg" alt="NtAboHF" width="583" height="1024" srcset="http://www.happyfridaygents.com/wp-content/uploads/2016/04/NtAboHF-768x1349.jpg 768w, http://www.sample.com/test2.jpg 583w, http://www.happyfridaygents.com/wp-content/uploads/2016/04/NtAboHF.jpg 828w" sizes="(max-width: 583px) 100vw, 583px" />']

我想提取紧跟在 src=" 部分之后的 http://www.sample.com/test.jpg 部分。

如果 p 只是一个这样的字符串,我可以使用 findall:

t = re.findall('src="(.+)" alt', p)
print t

但是如何遍历列表并返回 P 中所有 url 的列表?

【问题讨论】:

标签: python regex python-2.7


【解决方案1】:

这是使用BeautifulSoup的解决方案:

>>> p = ['<img class="alignnone size-full wp-image-2087" src="http://www.sample.com/test.jpg" alt="0wCR41v" width="540" height="720" srcset="http://www.sample.com/test-225x300.jpg 225w, http://www.sample.com/test.jpg 540w" sizes="(max-width: 540px) 100vw, 540px" />', '<img class="alignnone size-large wp-image-2133" src="http://www.sample.com/test2.jpg" alt="NtAboHF" width="583" height="1024" srcset="http://www.happyfridaygents.com/wp-content/uploads/2016/04/NtAboHF-768x1349.jpg 768w, http://www.sample.com/test2.jpg 583w, http://www.happyfridaygents.com/wp-content/uploads/2016/04/NtAboHF.jpg 828w" sizes="(max-width: 583px) 100vw, 583px" />']

>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup(''.join(p), 'html.parser')
>>> src_links = [img['src'] for img in soup.find_all('img')]

>>> src_links
[u'http://www.sample.com/test.jpg', u'http://www.sample.com/test2.jpg']

如果你确实想使用正则表达式:

>>> regex = re.compile(r'src="(.+)" alt')
>>> [regex.search(img).group(1) for img in p]
['http://www.sample.com/test.jpg', 'http://www.sample.com/test2.jpg']

【讨论】:

  • 谢谢。我使用的是正则表达式版本。
【解决方案2】:

如何循环执行:

>>> pe = re.compile('src="(.+)" alt')
>>> for img in p:
...     print pe.findall(img)
... 
['http://www.sample.com/test.jpg']
['http://www.sample.com/test2.jpg']

【讨论】:

    【解决方案3】:

    这是你想要的吗?

    import re
    p = ['<img class="alignnone size-full wp-image-2087" src="http://www.sample.com/test.jpg" alt="0wCR41v" width="540" height="720" srcset="http://www.sample.com/test-225x300.jpg 225w, http://www.sample.com/test.jpg 540w" sizes="(max-width: 540px) 100vw, 540px" />', '<img class="alignnone size-large wp-image-2133" src="http://www.sample.com/test2.jpg" alt="NtAboHF" width="583" height="1024" srcset="http://www.happyfridaygents.com/wp-content/uploads/2016/04/NtAboHF-768x1349.jpg 768w, http://www.sample.com/test2.jpg 583w, http://www.happyfridaygents.com/wp-content/uploads/2016/04/NtAboHF.jpg 828w" sizes="(max-width: 583px) 100vw, 583px" />']
    outList = [re.findall('src="(.+)" alt', pp)[0] for pp in p]
    

    【讨论】:

    • 我只迟到了 4 分钟 :)
    • 不确定这是否是有意的,但这会返回一个列表,但每个元素(url)本身就是一个列表。对吗?
    • 没错,我已经编辑了答案,所以每个元素都只是一个字符串,而不是一个列表。
    【解决方案4】:

    使用列表推导:

    l = [re.findall('src="(.+)" alt', each_url) for each_url in p] 
    

    这将为您提供可以链接在一起的列表:

    import itertools
    urls = list(itertools.chain(*l))
    

    不过,其他地方给出的正则表达式答案更优雅。

    【讨论】:

    • 这里同样适用于我写给彼得的信。 “不确定这是否是有意的,但这会返回一个列表,但每个元素(url)本身就是一个列表。对吗?”
    • @Bernardo 我修改了代码以返回 url 列表,但我建议使用正则表达式。
    • 谢谢。我回家后看看。
    【解决方案5】:
    for i in p:
        t = re.findall('src="(.+)" alt', i)
        print t
    

    更新:

    k=[re.findall('src="(.+)" alt',i) for i in p]
    [item for sublist in k for item in sublist]
    

    ['http://www.sample.com/test.jpg', 'http://www.sample.com/test2.jpg']

    【讨论】:

    • 谢谢,但这会打印两个列表。我正在寻找一个网址列表。我想我可以加入他们。
    猜你喜欢
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 2021-08-20
    • 1970-01-01
    • 2020-09-12
    • 2012-05-28
    • 2012-10-13
    相关资源
    最近更新 更多