【问题标题】:Regex to capture url until a certain character正则表达式捕获 url 直到某个字符
【发布时间】:2016-06-04 06:40:09
【问题描述】:

带有 url 之类的

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

我正在使用

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

作为搜索模式。

我想选择任何 url,如上面的 yahoo url,但我想在实际 url 中捕获直到文字 ? 的 url。

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

上面的正则表达式可以工作并提取 url,但会到达 url 的末尾。我怎样才能让它在它遇到的第一个? 处停止,如果它没有遇到? 则继续走到最后

【问题讨论】:

  • 你能把你尝试过的代码添加到这个问题中吗?
  • from os import system;system('cls')\n from urllib import urlopen;import re\n # 寻找类似 url+sometext(stopCaptureAtLiteral?"> Some Text 的行 a>\n count = 0\n pat = re.compile(r'yahoo.com')\n for line in nh:\n if re.search(pat,line):\n count += 1\n print count,re.search(pat,line).group (1)\n 请看评论想要捕获锚标记拉出一个 url 但\n 直到 ?如果网址中有一个,则整个网址\n
  • 对不起,我无法弄清楚如何换行我在论坛上查看过尝试
    标签但没有用,所以我添加了 \n 也没有用,但会只是告诉你行尾,很抱歉试图弄清楚
  • 你好 Bobble 泡泡,你击中了那个泡泡;现在我得到了一个非常干净的输出非常感谢您

标签: python regex capture regex-group


【解决方案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

【讨论】:

  • 伙计们非常感谢你已经回答了我的问题,我真的很感激,我正在尝试一些接近你所做的事情/实际上这就是我在发布问题之前正在尝试的事情,并且是的,我也可以使用拆分,只是希望它尽可能简洁。非常感谢你们是最棒的
【解决方案2】:

上面的泡泡解决方案对我来说效果很好;

“您可以通过使用否定类来尝试这样的操作:]*?href="(http[^"?]+)”

网址是这样的

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 的回答并且工作得非常干净,做我想做的事,再次感谢大家参与这个讨论,真的很感激。

【讨论】:

    【解决方案3】:

    我同意其他答案,在这里使用正则表达式不是一个解决方案,特别是因为在打开 &lt;a&gt; 标记和 href 参数之前我有任意数量的参数,之间也可以有一个新的线。

    但是,回答最初的问题:

    “*”、“+”和“?”限定符都是贪婪的——它们匹配尽可能多的文本

    这就是为什么会有非贪婪版本的原因:

    '*?', '+?'和'??'

    【讨论】:

    • 会吗??表示文字问号可能出现 0 次或一次
    猜你喜欢
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    相关资源
    最近更新 更多