正则表达式捕获url直到某个字符

时间:2016-06-04 06:40:09

标签: python regex capture regex-group

使用

等网址
  

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

我正在使用

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

作为搜索模式。

我想选择任何网址,例如上面的雅虎网址,但我希望将网址捕获到实际网址中的文字?

换句话说,我想将网址提取到?,因为我知道我解析的所有网址都没有?字符。在这种情况下,我需要捕获所有网址。

上面的正则表达式工作并提取url但是到了url的末尾。我怎样才能让它在遇到的第一个?时停下来,如果它没有遇到?

,它会一直走到尽头

3 个答案:

答案 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&amp;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的回答和工作非常干净,做了我想做的事情,再次感谢大家参与这次讨论,真的很感激。