【问题标题】:Issue with string replacing and regex字符串替换和正则表达式的问题
【发布时间】:2013-06-05 07:10:33
【问题描述】:

我正在编写一个函数来将 url 转换为工作链接。这必须转换每种形式:完整的 url 像 http://link.com,没有像 www.link.com 这样的协议,即使只有像 link.com 这样的扩展。

到目前为止,我的函数正在运行,但是当字符串中有多个相同的链接时,会出现一个奇怪的错误。

import re
import cgi

def process_links(string):
    """Convert urls to links in a string"""
    # http + https
    links = re.findall("(https?://[^\s]+)", string)
    # www
    links2 = re.findall("(w{3}\.[^\s]+)", string)
    # only extension
    links3 = re.findall("([^\s]+\.[^\s]{2,})", string)
    links = links + links2 + links3
    # remove duplicates
    links = list(set(links))
    string = cgi.escape(string)
    for link in links:
        # make sure the href attr starts with http|https
        if re.match('https?://', link) is None:
            http_link = 'http://'+link
        else:
            http_link = link
        htmlLink = '<a href="'+http_link+'">'+link+'</a>'
        string = re.sub(link, htmlLink, string)
    return string

工作和失败的例子:

# working
string = 'firstlink.com and www.secondlink.com'
# output:
# '<a href="http://firstlink.com">firstlink.com</a> and <a href="http://www.secondlink.com">www.secondlink.com</a>    

# failing: when there are several times the same link
string = 'firstlink.com and http://firstlink.com
# output:
# <a href="<a href="http://firstlink.com">http://firstlink.com</a>">firstlink.com</a> and http://<a href="<a href="http://firstlink.com">http://firstlink.com</a>">firstlink.com</a>

我从未尝试在 python 中使用这种“复杂”的正则表达式,也无法弄清楚为什么会出现这种奇怪的行为。我认为这来自re.sub() 部分,它可能会替换已经被替换的东西?

PS:我的功能可能不是最好的,当然可以改进,如果你有什么建议我正在听

【问题讨论】:

标签: python regex


【解决方案1】:

您希望在找到它们时处理它们,并找到所有带有一个正则表达式的表单。使用re.sub() 和替换函数将是最简单的:

def linkify(match):
    link = match.group(1)
    http_link = link if re.match('https?://', link) else 'http://' + link
    return '<a href="{}">{}</a>'.format(http_link, link)

links = re.compile(r'(https?://[^\s]+|w{3}\.[^\s]+|[^\s]+\.[^\s]{2,})')
string = links.sub(linkify, string)

通过将 3 种形式组合成一个模式,您可以防止多次匹配同一个链接,并且通过使用替换功能,您还可以避免替换使用同一链接的较短形式的多次出现(链接的 http://firstlink.com 仍然包含firstlink.com 部分用于将来的替换调用)。

演示:

>>> string = 'firstlink.com and www.secondlink.com'
>>> links.sub(linkify, string)
'<a href="http://firstlink.com">firstlink.com</a> and <a href="http://www.secondlink.com">www.secondlink.com</a>'
>>> string = 'firstlink.com and http://firstlink.com'
>>> links.sub(linkify, string)
'<a href="http://firstlink.com">firstlink.com</a> and <a href="http://firstlink.com">http://firstlink.com</a>'

【讨论】:

  • 谢谢,我尝试使用 compile 方法但无法正常工作
猜你喜欢
  • 1970-01-01
  • 2019-04-17
  • 2018-07-13
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多