匹配未包含在<a> tag</a>中的所有网址

时间:2009-08-18 21:56:33

标签: python regex

我正在寻找一个正则表达式模式,它可以匹配HTML中没有包含在'a'标签中的URL,以便将它们进一步包装成'a'标签(即突出显示所有未突出显示的链接)。 / p>

输入是简单的HTML,允许使用'a','b','i','br','p''img'标签。所有其他HTML标记不应出现在输入中,但上面提到的标记可以以任何组合出现。

因此,模式应该省略作为现有“a”标记的一部分的所有网址,并匹配所有其他链接,这些链接只是未包含在“a”标记中的纯文本,因此不会突出显示,也不是超链接。如果模式匹配以http://,https://或www。开头并以.net,.com结尾的网址,那将是一件好事。或.org如果网址不是以http://,https://或www。

开头

我尝试了类似'(?!&lt; [aA] [^&gt;] +&gt;)http://[a-zA-Z0-9._-]+(?!)'的内容,以匹配比上述更简单的情况,但似乎这项任务并不那么明显。

非常感谢您的帮助。

3 个答案:

答案 0 :(得分:5)

您可以使用BeautifulSoup或类似内容排除已经属于链接的所有网址。

然后你可以将纯文本与其中一个已经存在的url正则表达式匹配(谷歌“url正则表达式”,你想要的那个取决于你想得到多少花哨)。

答案 1 :(得分:5)

根据定义,使用单个正则表达式解析HTML几乎是不可能的,因为正则表达式没有状态。

构建/使用真正的解析器。可能是BeautifulSouphtml5lib

以下代码使用BeautifulSoup从页面中提取所有链接:

from BeautifulSoup import BeautifulSoup
from urllib2 import urlopen

url = 'http://stackoverflow.com/questions/1296778/'
stream = urlopen(url)
soup = BeautifulSoup(stream)
for link in soup.findAll('a'):
    if link.has_key('href'):
        print unicode(link.string), '->', link['href']

同样,您可以使用soup.findAll(text=True)查找所有文字并在那里搜索网址。

搜索网址也非常复杂 - 您不会相信网址上允许的内容。一个简单的搜索显示了数千个示例,但没有一个完全符合规范。你应该尝试一下对你有用的东西。

答案 2 :(得分:-2)

谢谢你们!以下是我的解决方案:

from django.utils.html import urlize # Yes, I am using Django's urlize to do all dirty work :)

def urlize_html(value):
    """
    Urlizes text containing simple HTML tags.
    """
    A_IMG_REGEX = r'(<[aA][^>]+>[^<]+</[aA]>|<[iI][mM][gG][^>]+>)'
    a_img_re = re.compile(A_IMG_REGEX)

    TAG_REGEX = r'(<[a-zA-Z]+[^>]+>|</[a-zA-Z]>)'
    tag_re = re.compile(TAG_REGEX)

    def process(s, p, f):
        return "".join([c if p.match(c) else f(c) for c in p.split(s)])

    def process_urlize(s):
        return process(s, tag_re, urlize)

    return process(value, a_img_re, process_urlize)