2015-03-08 5 views
1

Я думаю, что это распространенная проблема. Но я не нашел удовлетворительного ответа в другом месте.Как получить правильное соответствие регулярным выражением?

Предположим, что я извлекаю некоторые ссылки с веб-сайта. Ссылки, как следующее:

http://example.com/goto/http://example1.com/123.html 
http://example1.com/456.html 
http://example.com/yyy/goto/http://example2.com/789.html 
http://example3.com/xxx.html 

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

http://example1.com/123.html 
http://example1.com/456.html 
http://example2.com/789.html 
http://example3.com/xxx.html 

Однако, я не могу этого сделать из-за жадных особенностью RE , 'http://.*$' будет соответствовать только всему предложению. Затем я попробовал 'http://.*?$', но это тоже не сработало. Также не было re.findall. Так есть ли другой способ сделать это?


Да. Я могу это сделать str.split или str.index. Но мне все еще интересно, есть ли для этого решение RE.

ответ

1

Вам не нужно использовать регулярное выражение можно использовать str.split() разделить ваши ссылки с // тогда пикапом последней части и конкатенацию, что с http//:

>>> s="""http://example.com/goto/http://example1.com/123.html 
... http://example1.com/456.html 
... http://example.com/yyy/goto/http://example2.com/789.html 
... http://example3.com/xxx.html""" 
>>> ['http://'+s.split('//')[-1] for link in s.split('\n')] 
['http://example3.com/xxx.html', 'http://example3.com/xxx.html', 'http://example3.com/xxx.html', 'http://example3.com/xxx.html'] 

И регулярным выражением вам просто нужно заменить все символы между 2 // с пустой строкой, но, как вам нужно один из // для первого использования positive look-behind:

>>> [re.sub(r'(?<=//)(.*)//','',link) for link in s.split('\n')] 
['http://example1.com/123.html', 'http://example1.com/456.html', 'http://example2.com/789.html', 'http://example3.com/xxx.html'] 
>>> 
+0

Ну, я знаю, что могу сделать это с помощью некоторых строковых манипуляций. Но мне все еще нужно одношаговое решение RE. – user2923419

+1

Почему? Что случилось с этим ответом? – user590028

+0

@ user2923419 ОК, я добавляю еще один способ с регулярным выражением !;), но все же первый способ рекомендуется! – Kasramvd

1

использования т его картины

^(.*?[^/])(?=\/[^/]).*?([^/]+)$ 

и заменить $1/$2
Demo


после прочтения комментария ниже, используйте этот шаблон, чтобы захватить то, что вы хотите

(http://(?:[^h]|h(?!ttp:))*)$ 

Demo


или эта модель

(http://(?:(?!http:).)*)$ 

Demo


или эта модель

http://.*?(?=http://) 

и заменить ничем
Demo

+0

@JanneKarila, я неправильно понял запрос, обновленный ответ выше –

Смежные вопросы