2016-06-08 5 views
0

Моя строка:Как я могу извлечь конкретный формат urg src url с помощью regex?

Russia's National Settlement Depository discusses why it believes the biggest blockchain opportunities have yet to be uncovered.<img alt="" height="1" src="http://feeds.feedburner.com/~r/CoinDesk/~4/rvoQUj-KDaw" width="1" />|One of the co-founder of digital currency startup Stellar announced their resignation today.<img alt="" height="1" src="http://feeds.feedburner.com/~r/CoinDesk/~4/xRzN7syt-v0" width="1" />|The editorial board for Bloomberg News has called for a permissive regulatory environment for blockchain development.<img alt="" height="1" src="http://feeds.feedburner.com/~r/CoinDesk/~4/ooQYB2iDxP8" width="1" />| 

Я хочу получить эти 3 ссылок в списке:

http://feeds.feedburner.com/~r/CoinDesk/~4/rvoQUj-KDaw 
http://feeds.feedburner.com/~r/CoinDesk/~4/xRzN7syt-v0 
http://feeds.feedburner.com/~r/CoinDesk/~4/ooQYB2iDxP8 

Они подчиняются схеме:

src="http://feeds.feedburner.com/~r/CoinDesk/~4/rvoQUj-KDaw" 

Я знаю, что я должен использовать re.findall(pattern, string) для достижения что.

Но большой вопрос: Как создать шаблон, который работает здесь?

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

pattern = 'http[s]?://(?:[a-zA-Z]|[0-9]|[[email protected]&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+' 

Но все, что я получил этот список :

[u'http://feeds.feedburner.com/', u'http://feeds.feedburner.com/', u'http://feeds.feedburner.com/'] 

похоже, проблема с ~r части и вещи после этого.

ответ

0

Вы пропускаете ~ символ в своем регулярном выражении:

http[s]?://(?:[a-zA-Z]|[0-9]|[[email protected]&+~]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+

кстати: this супер способ проверить регулярное выражение в Python!

+1

Я использую regex101 , но мне понравился ваш сайт! закладка! thx –

0

попробовать этот скрипт:

text1="""Russia's National Settlement Depository discusses why it believes the biggest blockchain opportunities have yet to be uncovered.<img alt="" height="1" src="http://feeds.feedburner.com/~r/CoinDesk/~4/rvoQUj-KDaw" width="1" />|One of the co-founder of digital currency startup Stellar announced their resignation today.<img alt="" height="1" src="http://feeds.feedburner.com/~r/CoinDesk/~4/xRzN7syt-v0" width="1" />|The editorial board for Bloomberg News has called for a permissive regulatory environment for blockchain development.<img alt="" height="1" src="http://feeds.feedburner.com/~r/CoinDesk/~4/ooQYB2iDxP8" width="1" />|""" 
import re 
print re.findall(r'(https?://\S+)', text1) 

и результат

['http://feeds.feedburner.com/~r/CoinDesk/~4/rvoQUj-KDaw"', 'http://feeds.feedburner.com/~r/CoinDesk/~4/xRzN7syt-v0"', 'http://feeds.feedburner.com/~r/CoinDesk/~4/ooQYB2iDxP8"'] 
+1

ничего себе! это простой способ получить всю эту информацию. похоже, моя голова была слишком сложной! –

0

попробовать это:

(?:src=)(".*?") 

и получить группу \ 1

DEMO

+0

голосуйте без проблем .. но объясните почему .. так, что я исправлю себя. –

2

где эти данные поступают? Я бы предложил использовать синтаксический анализатор html вместо того, чтобы пытаться извлечь с помощью регулярного выражения. вы можете вытащить полные значения внутри тегов там, если это исходит от HTML

ниже я положить строку в test.html (для питона, используя BeautifulSoup в качестве примера)

>>> from bs4 import BeautifulSoup 
>>> soup = BeautifulSoup(open(r'A:\test.html')) 
>>> [x['src'] for x in soup.findAll('img')] 
['http://feeds.feedburner.com/~r/CoinDesk/~4/rvoQUj-KDaw', 'http://feeds.feedburner.com/~r/CoinDesk/~4/xRzN7syt-v0', 'http://feeds.feedburner.com/~r/CoinDesk/~4/ooQYB2iDxP8'] 
+1

Хотя это хороший совет, он не пытается ответить на вопрос. –

+0

извините за это ... fixed :) – NikT

+0

Слишком много вещей может пойти не так с регулярным выражением, это будет мой предпочтительный выбор. –