Если вам действительно нужна старая версия php и вы все еще хотите использовать актуальную версию os (что вам следует !!)
, вы можете попробовать docker:
docker-compose .yml:
version: "3.5"
services:
php:
image: php:5.6-apache
ports:
- 80:80
volumes:
- ./:/var/www/html
-> это ограничит ваше одно приложение для использования этой старой версии php
Если Вы только ищете тот:
import re
match = re.search(r'href=[\'"]?([^\'" >]+)', s)
if match:
print match.group(0)
, Если Вы имеете длинную строку и хотите каждый экземпляр шаблона в нем:
import re
urls = re.findall(r'href=[\'"]?([^\'" >]+)', s)
print ', '.join(urls)
, Где s
строка, в которой Вы ищете соответствия.
Быстрое объяснение regexp битов:
r'...'
"необработанная" строка. Это останавливает Вас имеющий необходимость волноваться о выходе из символов вполне так, как Вы обычно были бы. (\
особенно - в сырых данных представляют в виде строки\
, просто\
. В обычной строке необходимо было бы сделать\\
каждый раз, и это становится старым в regexps.)"
href=[\'"]?
," говорит для соответствия "href = ", возможно сопровождаемый'
или"
. "Возможно", потому что трудно сказать, насколько ужасный HTML, на который Вы смотрите, и кавычки строго не требуются.Включение следующего бита в"
()
," говорит для создания этого "группой", что означает разделять его туда и обратно он отдельно нам. Это - просто способ сказать, что "это - часть шаблона, которым я интересуюсь. ""
[^\'" >]+
," говорит для соответствия любым символам, которые не являются'
,"
,>
, или пространство. По существу это - список символов, которые являются концом URL. Это позволяет нам постараться не пытаться записать regexp, который надежно соответствует полному URL, который может быть немного сложным.
предложение в другом ответе для использования BeautifulSoup не плохо, но это действительно представляет более высокий уровень внешних требований. Плюс он не помогает Вам в Вашей установленной цели изучения regexps, который я предположил бы, что этот определенный анализирующий HTML проект является просто частью.
довольно легко сделать:
from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(html_to_parse)
for tag in soup.findAll('a', href=True):
print tag['href']
, После того как Вы установили BeautifulSoup, так или иначе.
Не используйте regexes, используйте BeautifulSoup. Это, или быть столь неработоспособным, что породить его к, скажем, w3m/lynx и отступить в том, что представляет w3m/lynx. Сначала является более изящным, вероятно, вторым просто работавший чертовски много быстрее на некотором неоптимизированном коде, который я написал некоторое время назад.
это должно работать, хотя могли бы быть более изящные пути.
import re
url='<a href="http://www.ptop.se" target="_blank">http://www.ptop.se</a>'
r = re.compile('(?<=href=").*?(?=")')
r.findall(url)
Регулярные выражения - это принципиально плохо разбирается в HTML (см. . Можете ли вы привести несколько примеров того, почему трудно анализировать XML и HTML с помощью регулярного выражения? почему). Что вам нужно, так это парсер HTML. См. Можете ли вы предоставить пример синтаксического анализа HTML с помощью вашего любимого синтаксического анализатора? для примеров с использованием различных синтаксических анализаторов.
В частности, вы захотите посмотреть ответы Python: BeautifulSoup , HTMLParser и lxml .
Да, их огромное количество в regexlib . Это только доказывает, что RE не следует использовать для этого. Используйте SGMLParser или BeautifulSoup или напишите парсер, но не используйте RE. Те, которые кажутся эффективными, чрезвычайно сложны и до сих пор не охватывают все случаи.
John Gruber (who wrote Markdown, which is made of regular expressions and is used right here on Stack Overflow) had a go at producing a regular expression that recognises URLs in text:
http://daringfireball.net/2009/11/liberal_regex_for_matching_urls
If you just want to grab the URL (i.e. you’re not really trying to parse the HTML), this might be more lightweight than an HTML parser.