使用
等网址
https://search.yahoo.com/search?p=Fetty+Wap&fr=fp-tts&
我正在使用
pat = re.compile('<a href="(https?://.*?)".*',re.DOTALL)
作为搜索模式。
我想选择任何网址,例如上面的雅虎网址,但我希望将网址捕获到实际网址中的文字?
。
换句话说,我想将网址提取到?
,因为我知道我解析的所有网址都没有?
字符。在这种情况下,我需要捕获所有网址。
上面的正则表达式工作并提取url但是到了url的末尾。我怎样才能让它在遇到的第一个?
时停下来,如果它没有遇到?
答案 0 :(得分:1)
正则表达式真的是错误的工具。做一个基本的字符串拆分可以得到你想要的。
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
如果您想想要使用正则表达式,我想您可以使用以下内容:
import re
def getBeforeQuestRegex(inputStr):
return re.search(r"(.+?\?|.+)", inputStr).group(0)
print(getBeforeQuestRegex("https://search.yahoo.com/search?p=Fetty+Wap&fr=fp-tts&"))
print(getBeforeQuestRegex("https://search.yahoo.com/sometext"))
#https://search.yahoo.com/search?
#https://search.yahoo.com/sometext
答案 1 :(得分:0)
我同意其他答案,在这里使用regexp不是一个解决方案,特别是因为在打开<a>
标签和href参数之前我有任意数量的参数,在它们之间也可能有一条新线
但是,回答最初的问题:
'*','+'和'?'限定符都是贪婪的 - 它们匹配尽可能多的文本
这就是为什么有非贪婪版本的原因:
'*?','+?'和'??'
答案 2 :(得分:0)
上面的Bobble泡泡解决方案对我来说效果很好;
“你可以通过使用否定的类来尝试这样:] *?href =”(http [^“?] +)”&lt; - 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
目标是在没有文字的情况下提取完整的网址?在它,但如果它确实在文字之前停止?。
是Bobble Bubbles的回答和工作非常干净,做了我想做的事情,再次感谢大家参与这次讨论,真的很感激。