Python разбить строку по URL с и без HREF - PullRequest
1 голос
/ 28 апреля 2020

На самом деле мой скрипт работает должным образом (разбивает строку по URL и сохраняет другой текст) и помещает в список:

import re
s = 'This is my tweet check it out http://www.example.com/blah and http://blabla.com'
result = re.split(r'(https?://\S+)', s)
print(result)

Вывод:

['This is my tweet check it out ', 'http://www.example.com/blah', ' and ', 'http://blabla.com', '']

Теперь я застрял в другой проблеме: иногда я получаю URL-адреса в виде html, или смешанный текст + html, и URL-адреса выглядят так:

<a href="http://www.example.com/full/path/to/product/">https://shorted.com/FJAKS</a>

href с полным URL-адресом, значение между <a>...</a> the сокращено url.

Таким образом, я могу получить такую ​​строку для манипуляции:

s = 'This is an html link: <a href="http://www.example.com/full/path/to/product/">https://shorted.com/FJAKS</a> and this is a text url: http://blabla.com'

Я хотел бы получить те же логики c для моей функции, но если я использую:

result = re.split(r'(https?://\S+)', s)
print(result)

, как раньше, я получаю это (НЕПРАВИЛЬНО):

['This is an html link: <a href="', 'http://www.example.com/full/path/to/product/">https://shorted.com/FJAKS</a>', ' and this is a text url: ', 'http://blabla.com', '']

Но я хотел бы получить ситуацию, подобную этой (если это HTML, получить все теги a):

Ожидаемый результат:

['This is an html link: ', '<a href="http://www.example.com/full/path/to/product/">https://shorted.com/FJAKS</a>', ' and this is a text url: ', 'http://blabla.com', '']

1 Ответ

1 голос
/ 28 апреля 2020

Попробуйте:

s = 'This is an html link: <a href="http://www.example.com/full/path/to/product/">https://shorted.com/FJAKS</a> and this is a text url: http://blabla.com'
result = re.split(r'((?:<a href=")?https?://\S+)', s)
print(result)

Ключ является добавлением (?:<a href=")?. (?:) означает группу, которая не захвачена; это полезно, так что ? применяется ко всей единице вместо одного символа.

Примечание: URL в начале или конце создает пустой элемент списка. Если вы хотите удалить их, попробуйте:

result = list(filter((None, result)))
...