Как получить первое предложение перед определенной строкой с помощью регулярных выражений - PullRequest
0 голосов
/ 13 апреля 2019

Я делаю некоторую очистку и хочу очистить определенную часть элемента 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"

Я хочу первый URL до 1200w.Таким образом, результат должен быть:

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

Зачем мне нужно регулярное выражение, последний элемент:

enter image description here

Заранее спасибои хороших выходных:)

Ответы [ 5 ]

1 голос
/ 13 апреля 2019

Нет необходимости в регулярных выражениях. Вы можете сделать это с помощью строковых методов 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.


Если вы должны использовать 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'
0 голосов
/ 13 апреля 2019

Шаблон .+?(?=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
0 голосов
/ 13 апреля 2019

При поиске r"600w, (.*) 1200w" ваша группа 1 должна вернуть URL-адрес, который вы ищете.

0 голосов
/ 13 апреля 2019

Вы можете использовать это регулярное выражение:

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

0 голосов
/ 13 апреля 2019

Или:

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)
...