Python: извлечение URL с помощью регулярных выражений или других средств - PullRequest
0 голосов
/ 02 сентября 2018

Я нахожусь в затруднении с проблемой. У меня есть большой фрейм данных, где два столбца похожи на это:

pd.DataFrame([['a', 'https://gofundme.com/ydvmve-surgery-for-jax,https://twitter.com/dog_rates/status/890971913173991426/photo/1'],          ['b','https://twitter.com/dog_rates/status/890971913173991426/photo/1,https://twitter.com/dog_rates/status/890971913173991426/photo/1'],['c','https://twitter.com/dog_rates/status/890971913173991430/video/1'] ],columns=['ID','URLs'])

То, что я пытаюсь сделать, это оставить только URL, включающий слово «twitter», оставленное в каждой ячейке, и удалить остальные. Шаблон заключается в том, что URL-адреса, которые я хочу, всегда включают слово «twitter» и оканчиваются на «/» + однозначное число. В тех случаях, когда в одной и той же ячейке есть два одинаковых URL-адреса, должен остаться только один. Как это:

Test2 = pd.DataFrame([['a', 'https://twitter.com/dog_rates/status/890971913173991426/photo/1'],
 ['b','https://twitter.com/dog_rates/status/890971913173991426/photo/1'],
 ['c','https://twitter.com/dog_rates/status/890971913173991430/video/1'] ],columns=['ID','URLs'])

Test2

Я новичок в Python, и после долгих поисков я начал понимать, что ответом является нечто, называемое регулярным выражением, но это все, что я понял. Одна из публикаций здесь, в Stackoverflow, привела меня на regex101.com, и после того, как я поэкспериментировал с этим, я дошел до того, что он не работает:

r’^[https]+(:)(//)(.*?)(/)(\d)’

Может кто-нибудь сказать мне, как решить эту проблему? Заранее спасибо.

1 Ответ

0 голосов
/ 02 сентября 2018

Регулярные выражения, безусловно, удобны для таких задач. Обратитесь к этому вопросу и онлайн-инструментам, таким как regex101 , чтобы узнать больше.

Ваш текущий шаблон неверен, потому что:

  • ^ Соответствует следующему шаблону в начале строки.
  • [https]+ Это набор символов, то есть он будет соответствовать h, s, ps, поэтому любая комбинация одной или нескольких букв присутствует в скобках [], а не только строк http и https - это то, что вам нужно.
  • (:) Вам не нужно помещать это : в группу захвата здесь.
  • (//) / Требуется экранировать в регулярном выражении, \/. Здесь также нет необходимости в захвате группы.
  • (.*?) Комбо .*? часто используется неправильно, когда вместо него может использоваться набор отрицательных символов [^].
  • (/) Как обсуждалось выше.
  • (\d) Соответствует и захватывает цифры. Группа захвата здесь также избыточна для вашей задачи.

Вы можете использовать следующее выражение:

https?:\/\/twitter\.com[^,]+(?<=\/\d$)
  • https? Соответствует буквенным подстрокам http или https.
  • :\/\/twitter\.com Соответствует буквенной подстроке ://twitter.com.
  • [^,]+ Все, что не является запятой, одним или несколькими.
  • (?<=\/\d$) Позитивный взгляд позади. Утвердите, что /, за которым следует цифра \d, присутствует в конце строки $.

Regex demo здесь .


Демонстрация Python:

import pandas as pd

df = pd.DataFrame([['a', 'https://gofundme.com/ydvmve-surgery-for-jax,https://twitter.com/dog_rates/status/890971913173991426/photo/1'],
                   ['b','https://twitter.com/dog_rates/status/890971913173991426/photo/1,https://twitter.com/dog_rates/status/890971913173991426/photo/1'],
                   ['c','https://twitter.com/dog_rates/status/890971913173991430/video/1'] ],columns=['ID','URLs'])

df['URLs'] = df['URLs'].str.findall(r"https?:\/\/twitter\.com[^,]+(?<=\/\d$)").str[0]
print(df)

Печать:

  ID                                                             URLs
0  a  https://twitter.com/dog_rates/status/890971913173991426/photo/1
1  b  https://twitter.com/dog_rates/status/890971913173991426/photo/1
2  c  https://twitter.com/dog_rates/status/890971913173991430/video/1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...