【问题标题】:Problem while using re.search in url detection in python在 python 的 url 检测中使用 re.search 时出现问题
【发布时间】:2021-04-02 09:12:26
【问题描述】:

我正在使用 re.search 将字符串中的 URL 替换为占位符“{url_object}”。这是我的代码:

def url_detector(text):
    urls = re.findall(r"(https?\:\/\/[\w\d:#@%\/;$()~_?\+-=\\\.&]*)", text)
    if len(urls)>0:
        for url in urls:
            span = re.search(url, text).span()
            text = text[:(span[0])] + '{url_object}' + text[span[1]:]
    return text

我使用的带有 URL 的文本如下:

text_list = ["google url is https://www.google.com/. Everyone frequently uses it",
             "https://www.google.com/search?q=simple+search&oq=simple+search&aqs=chrome..69i57j0l9.2908j0j7&sourceid=chrome&ie=UTF-8 is the url for simplesearch",
            "url for today's news : https://www.google.com/search?q=news+today&sxsrf=ALeKk00r1fVK6JeIaO1bhigZSu8IEGjgQw%3A1617353154494&ei=wtlmYIrXHdXez7sP6v-XwAw&oq=news+today&gs_lcp=Cgdnd3Mtd2l6EAMyCggAELEDEIMBEEMyCAgAELEDEIMBMggIABCxAxCDATIICAAQsQMQgwEyCAgAELEDEIMBMggIABCxAxCDATIICAAQsQMQgwEyCAgAELEDEIMBMggIABCxAxCDATICCAA6BwgAEEcQsAM6BwgAELADEEM6CgguELADEMgDEEM6BAgAEEM6BwgAELEDEEM6BQgAELEDSgUIOBIBMVDUBliRFGCzGGgBcAJ4AIABnAGIAacHkgEDMC43mAEAoAEBqgEHZ3dzLXdpesgBC8ABAQ&sclient=gws-wiz&ved=0ahUKEwiKwP-Blt_vAhVV73MBHer_BcgQ4dUDCA0&uact=5, date = 02/04/2021",
            "sample url = https://www.google.com/search?q=sample&sxsrf=ALeKk02uixAiZMyqhMtSZZwbeYefHRutGQ%3A1617353222151&ei=BtpmYKfTCJKD4-EPlLWVeA&oq=sample&gs_lcp=Cgdnd3Mtd2l6EAMyBAgjECcyBQgAELEDMgUIABCxAzIECAAQQzIFCAAQsQMyBAgAEEMyAggAMgUIABCxAzIFCAAQsQMyBQgAELEDOgcIABBHELADOgcIABCwAxBDOgcIABCHAhAUUKERWN4UYMIYaAFwAngAgAGWAYgB9ASSAQMwLjWYAQCgAQGqAQdnd3Mtd2l6yAEKwAEB&sclient=gws-wiz&ved=0ahUKEwin7qCilt_vAhWSwTgGHZRaBQ8Q4dUDCA0&uact=5"]

我在上面的列表中尝试了 url_detector

for text in text_list:
    print(url_detector(text))

虽然我希望输出看起来像这样:

google url is {url_object}. Everyone frequently uses it
{url_object} is the url for simple search
url for today's news : {url_object}, date = 02/04/2021
sample url = {url_object}

我知道了:

google url is {url_object}. Everyone frequently uses it
'NoneType' object has no attribute 'span'

这似乎是由于“?”的存在而发生的。在从 re.findall 获得的 URL 中。

这可能是因为 re 正在处理 '?'因为它的特殊意义。所以,我试着替换'?和 '\?'让它工作。但 '?'正在被替换为“\\?”。当这种模式与 re.search() 一起使用时,它会产生错误:

error: bad escape (end of pattern) at position 29.

关于如何解决这个问题的任何想法?提前致谢。

【问题讨论】:

  • url 括在re.escape() 的句子span = re.search(url, text).span()

标签: python regex url python-re


【解决方案1】:

尝试在句子span = re.search(url, text).span() 中将url 括在re.escape() 中,如下所示:

span = re.search(re.escape(url), text).span()

原因是您在第一个 re.findall() 中提取的结果包含一些特殊字符,例如? 正则表达式引擎将视为特殊的正则表达式令牌。因此,即使您稍后使用re.search() 搜索已经匹配的结果,由于这些特殊字符被正则表达式引擎误解,它仍然会不匹配(因此返回 NoneType 对象)。

re.escape():

转义模式中的特殊字符。如果您想这样做,这很有用 匹配可能具有正则表达式的任意文字字符串 元字符。

【讨论】:

    猜你喜欢
    • 2020-06-27
    • 2021-09-07
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 2011-01-14
    • 2019-01-19
    相关资源
    最近更新 更多