2016-06-04 3 views
0

С URL, такие какRegex чтобы захватить URL до определенного символа

https://search.yahoo.com/search?p=Fetty+Wap&fr=fp-tts&

Я использую

pat = re.compile('<a href="(https?://.*?)".*',re.DOTALL) 

в качестве шаблона поиска.

Я хочу выбрать любой URL-адрес, например, URL-адрес yahoo, но я хочу уловить URL-адрес до буквального ? в действительном URL-адресе.

Другими словами, я хочу извлечь URL-адрес до ?, зная, что все URL-адреса, которые я обрабатываю, не имеют символа ?. В таком случае мне нужно захватить весь URL.

Вышеупомянутое регулярное выражение работает и извлекает URL-адрес, но доходит до конца URL-адреса. Как я могу заставить его остановиться на первом ?, с которым он сталкивается, и продолжайте идти до конца, если он не встречает ?

+0

Вы не можете добавить комментарий, который вы пытали? – Chet

+0

из ОС импорта системы; системы ('ЦБС') \ п от URLLIB импорта urlopen, импорт повторно \ п # внешний вид для линий как Some Text \ п Count = 0 \ п погладить = re.compile (г '<а href = "(https?: // (. +? \? |. +?))". * ', re.DOTALL) \ n nh = urlopen (' http://www.yahoo.com ') \ n для строки в nh: \ n if re.search (pat, line): \ n count + = 1 \ n print count, re.search (pat, line) .group (1) \ n Please посмотрите на комментарий хотите, чтобы захватить якорный тег вытащить URL-адрес, но \ n только до? если есть один в url еще весь url \ n – saeed1r

+0

извините, я не могу понять, как сделать разрыв строки. Я смотрел на форумах, пробовал
тег, но это не сработало, поэтому я добавил \ n, что не работал либо просто покажу вам конец строки, поэтому извините, пытаясь понять это. – saeed1r

ответ

1

Regex - действительно неправильный инструмент для работы. Выполнение базового разделения строк даст вам именно то, что вы хотите.

def beforeQuestionMrk(inputStr): 
    return inputStr.split("?")[0] 

url = "https://search.yahoo.com/sometext" 
url2 = "https://search.yahoo.com/search?p=Fetty+Wap&fr=fp-tts&" 

print(beforeQuestionMrk(url)) 
print(beforeQuestionMrk(url2)) 

#https://search.yahoo.com/sometext 
#https://search.yahoo.com/search 

Если вы действительно хотели хотели использовать регулярное выражение, я полагаю, вы могли Fo следующего:

import re 

def getBeforeQuestRegex(inputStr): 
    return re.search(r"(.+?\?|.+)", inputStr).group(0) 


print(getBeforeQuestRegex("https://search.yahoo.com/search?p=Fetty+Wap&amp;fr=fp-tts&")) 
print(getBeforeQuestRegex("https://search.yahoo.com/sometext")) 

#https://search.yahoo.com/search? 
#https://search.yahoo.com/sometext 
+0

. Ребята, спасибо вам, что вы уже ответили на мой вопрос, я очень ценю это, я пытался что-то близко к тому, что вы сделали/на самом деле это то, что я пытался, вопрос, И да, я тоже мог бы использовать раскол, просто хотел, чтобы это было максимально кратким. Большое вам спасибо, ребята, лучшие – saeed1r

0

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

, но, отвечая на первоначальный вопрос: '?'

'*', '+', и классификаторы все жадные - они совпадают много текста, как это возможно

, поэтому существует не жадные их версии:

«*», «? +» а также '??'

+0

Есть ли? Значит, буквальный знак вопроса может появляться 0 или один раз – saeed1r

+0

https://docs.python.org/3/library/re.html – Jerzyk

0

Решение для пузырьков пузырьков выше работало очень хорошо для меня;

«Вы можете попробовать это с помощью класса с отрицанием:] *? Href =" (http [^ "?] +)" < - bobbles answer.

URL выглядит следующим образом

https://search.yahoo.com/search?p=Justin+Bieber&fr=fp-tts&fr2=p:fp,m:tn,ct:all ......

или это может быть что-то вроде этого https://www.yahoo.com/style/5-joyful-bob-ross-tees-202237009.html

задачей было извлечь полный URL, если не было никакого буквального? в нем, но если это сделать, чтобы остановить прямо перед буквальным? ».

был Bobble Bubbles ответил и работает очень чисто, делает то, что я хотел сделать, Еще раз спасибо за каждого, участвующего в этом обсуждении, действительно оцените его.

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