Python 如何使用正则表达式获取定义字符串前的第一句话

Python 如何使用正则表达式获取定义字符串前的第一句话,python,regex,screen-scraping,Python,Regex,Screen Scraping,我正在做一些刮取,我想刮取src元素的某个部分,但不确定如何使用regex来完成。这里有能帮我的regex忍者吗 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/artic

我正在做一些刮取,我想刮取src元素的某个部分,但不确定如何使用regex来完成。这里有能帮我的regex忍者吗

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之前的第一个url。因此,结果应该是:

https://cimg.co/w/articles/4/5ca/f022bb06dc.png
为什么我需要regex作为最后一个元素:


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

不需要正则表达式。您可以使用字符串方法
split
partition

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


如果必须使用正则表达式,可以执行以下操作:

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

  • 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'
或:


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

搜索
r“600w,(.*)1200w”
,您的第1组应该返回您要查找的url。

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

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

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

例如:

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

你需要展示自己完成它的尝试。使用可爱的regexI工具,直到:
+?(?=1200w)
然后卡住。还使用了regex101.com,我使用的是Django Dynamic Scraper,因此我需要使用regex。
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