Как выбрать URL изображения, не включая "/"? - PullRequest
2 голосов
/ 05 июня 2019

Я пытаюсь выяснить, как Series.str.extract () URL-адреса изображения (image-image-image.jpg) в новый столбец, но у меня проблемы с Regex. Что я делаю не так?

Вот как выглядят мои данные

<a href="https://website.com/wp-content/uploads/2018/09/image-image.image.jpg"><img class="alignnone size-medium wp-image-11275" src="https://website.com/wp-content/uploads/2018/09/image-image.image-300x200.jpg" alt="" width="300" height="200" /></a> <a href="https://kids-at-home.ch/wp-content/uploads/2018/09/image2-image2-image2.jpg"><img class="alignnone size-medium wp-image-11271" src="https://kids-at-home.ch/wp-content/uploads/2018/09/image2-image2-image2.jpg-300x200.jpg" alt="" width="300" height="200" />

Я попытался исключить все "/" из совпадений и положительно отозвался о "/", поэтому он начинается там, и у ""> "положительный прогноз, но, похоже, это не сработало. используя Regexr и мой ноутбук Jupyter, если проблема возникла оттуда.

Вот мой код Regex г '^ (? (/)?!.) $ <(</em> .jpg.) (= \ "? (= /))?>'

Я ожидал, что совпадение с регулярным выражением будет image-image.image.jpg и image2-image2.image2.jpg , но оно ничего не соответствует.

РЕШЕННЫЙ КОД РЕКСА

r'''(?<=/)([^/"']*\.jpe?g)(?=\"\>)"'''

Ответы [ 3 ]

2 голосов
/ 05 июня 2019

Немного более исчерпывающее решение:

https?:\/\/[A-z0-9-_.\/%]+\/([A-z0-9-_.%]+?\.(png|jpe?g|png))

Это кажется немного пугающим, но немного более многословным и также поддерживает закодированные URL-адреса.Вы можете найти имя вашего изображения в первой соответствующей группе ($ 1).

0 голосов
/ 05 июня 2019

Используйте

df['col'].str.extractall(r'''/([^/"']*\.jpe?g)"''')

Шаблон /([^/"']*\.jpg)" соответствует /, затем фиксирует в Группе 1 любой ноль или более символов, отличных от /, " и ', а затем .jpg / .jpeg, а затем просто соответствует ".

Обратите внимание, что вам не нужны обходные пути, потому что pandas.Series.str.extractall возвращает только то, что было записано в Группу 1 (или любую группу захвата в шаблоне, но здесь есть только 1 группа захвата).

См. Демонстрационную версию regex , результат будет содержать только те части, которые выделены зеленым цветом. Смотрите также график регулярных выражений :

enter image description here

Детали

  • / - / char
  • ([^/"']*\.jpe?g) - Группа 1 (выход): любые 0+ символов, кроме /, " и ', а затем .jpeg или .jpg
  • " - " char.
0 голосов
/ 05 июня 2019

Здесь мы, возможно, не захотим добавлять начальный и конечный якоря, и мы начнем с простого выражения, такого как:

"https?.+?\.(jpg)"

Если мы хотим разрешить другие расширения, такие как gif или png, мы можем просто сделать это с помощью логических ИЛИ |:

"https?.+?\.(jpe?g|gif|png)"

Если мы хотим захватить наши URL, мы просто добавим группу захвата:

"(https?.+?\.(jpe?g|gif|png))"

Демо

Тест

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"\"(https?.+?\.(jpe?g|gif|png))\""

test_str = "<a href=\"https://website.com/wp-content/uploads/2018/09/image-image.image.jpg\"><img class=\"alignnone size-medium wp-image-11275\" src=\"https://website.com/wp-content/uploads/2018/09/image-image.image-300x200.jpg\" alt=\"\" width=\"300\" height=\"200\" /></a> <a href=\"https://kids-at-home.ch/wp-content/uploads/2018/09/image2-image2-image2.jpg\"><img class=\"alignnone size-medium wp-image-11271\" src=\"https://kids-at-home.ch/wp-content/uploads/2018/09/image2-image2-image2.jpg-300x200.jpg\" alt=\"\" width=\"300\" height=\"200\" />
"

matches = re.finditer(regex, test_str, re.MULTILINE | re.IGNORECASE)

for matchNum, match in enumerate(matches, start=1):

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))

    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1

        print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

...