如何使用Regex在定义的字符串之前获取第一句话

时间:2019-04-13 09:51:28

标签: python regex screen-scraping

我正在抓取某些内容,但我想抓取src元素的特定部分,但不确定如何使用正则表达式执行此操作。这里有正则表达式忍者可以帮助我吗?

srcset="https://cimg.co/w/articles/1/5ca/f022bb06dc.png 150w, https://cimg.co/w/articles/2/5ca/f022bb06dc.png 300w, https://cimg.co/w/articles/3/5ca/f022bb06dc.png 600w, https://cimg.co/w/articles/4/5ca/f022bb06dc.png 1200w"

我想要1200w之前的第一个网址。因此结果应该是:

https://cimg.co/w/articles/4/5ca/f022bb06dc.png

为什么我需要正则表达式,最后一个元素:

enter image description here

提前感谢,祝您周末愉快:)

5 个答案:

答案 0 :(得分:1)

无需正则表达式。您可以使用字符串方法splitpartition来做到这一点:

In [181]: srcset = "https://cimg.co/w/articles/1/5ca/f022bb06dc.png 150w, https://cimg.co/w/articles/2/5ca/f022bb06dc.png 300w, https://cimg.co/w/articles/3/5ca/f022bb06dc.png 600w, https://cimg.co/w/arti
     ...: cles/4/5ca/f022bb06dc.png 1200w"                                                                                                                                                                  

In [182]: def get_url(srcset): 
     ...:     for str_ in srcset.split(','): 
     ...:         url, _, ext = str_.strip().partition(' ') 
     ...:         if ext == '1200w': 
     ...:             return url 
     ...:                                                                                                                                                                                                   

In [183]: get_url(srcset)                                                                                                                                                                                   
Out[183]: 'https://cimg.co/w/articles/4/5ca/f022bb06dc.png'

假设,不在URL中。


如果必须使用Regex,则可以执行以下操作:

https?://\S+(?=\s+1200w\b)

所以:

In [184]: re.search(r'https?://\S+(?=\s+1200w\b)', srcset).group()                                                                                                                                          
Out[184]: 'https://cimg.co/w/articles/4/5ca/f022bb06dc.png'
  • https?://\S+与URL匹配
  • 零宽度正向查找((?=\s+1200w\b))确保URL后跟一个或多个空格(\s+),然后是1200w

OTOH,如果您不满意基于HTTP方案的匹配,则可以匹配开始或,,并获取第一个捕获的组:

In [185]: re.search(r'(?:^|,\s+)(\S+)\s+1200w\b', srcset).group(1)                                                                                                                                          
Out[185]: 'https://cimg.co/w/articles/4/5ca/f022bb06dc.png'

答案 1 :(得分:0)

或者:

a = 'srcset="https://cimg.co/w/articles/1/5ca/f022bb06dc.png 150w, https://cimg.co/w/articles/2/5ca/f022bb06dc.png 300w, https://cimg.co/w/articles/3/5ca/f022bb06dc.png 600w, https://cimg.co/w/articles/4/5ca/f022bb06dc.png 1200w"'

a = a.replace('srcset=', '').replace('"', '').split(',')
done = a[len(a)-1].strip().split(' ')[0]
print(done)

答案 2 :(得分:0)

您可以使用此正则表达式:

[^\s,"]+(?=\s+1200w\b)

答案 3 :(得分:0)

搜索r"600w, (.*) 1200w"时,第1组应该返回您要查找的网址。

答案 4 :(得分:0)

模式.+?(?=1200w)将匹配除换行符以外的任何字符1次以上,直到右边的1200

要使用正则表达式获得更具体的匹配,可以使用捕获组:

\bsrcset="[^"]* (https?://\S+)\s+1200w"

Regex demo | Python demo

例如:

import re
regex = r'\bsrcset="[^"]* (https?://\S+)\s+1200w"'
test_str = """srcset=\"https://cimg.co/w/articles/1/5ca/f022bb06dc.png 150w, https://cimg.co/w/articles/2/5ca/f022bb06dc.png 300w, https://cimg.co/w/articles/3/5ca/f022bb06dc.png 600w, https://cimg.co/w/articles/4/5ca/f022bb06dc.png 1200w\""""

matches = re.search(regex, test_str)
if matches:
    print(matches.group(1))

结果

https://cimg.co/w/articles/4/5ca/f022bb06dc.png