【问题标题】:Python Regex: Replace all urls in string with <img> and <a> tagsPython 正则表达式:用 <img> 和 <a> 标签替换字符串中的所有 url
【发布时间】:2018-07-13 14:16:16
【问题描述】:

我有一个字符串,其中包含一些页面和图像的许多 url:

La-la-la https://example.com/ la-la-la https://example.com/example.PNG

我需要将其转换为:

La-la-la &lt;a href="https://example.com/"&gt;https://example.com/&lt;/a&gt; la-la-la &lt;img src="https://example.com/example.PNG"&gt;

图片格式不可预知,可以是.png.JPEG等,任何链接每个字符串都可以找到多次

我知道,这里有一些奇怪的 javascript 示例,但我不知道如何将它们转换为 python。

但我发现这是一个起点:

url_regex = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&amp;@#\/%?=~_|!:,.;]*[-A-Z0-9+&amp;@#\/%=~_|])/ig img_regex = /^ftp|http|https?:\/\/(?:[a-z\-]+\.)+[a-z]{2,6}(?:\/[^\/#?]+)+\.(?:jpe?g|gif|png)$/ig

非常感谢帮助

【问题讨论】:

    标签: python regex replace


    【解决方案1】:

    如果你愿意,你可以不使用regex 来做到这一点。

    stng = 'La-la-la https://example.com/ la-la-la https://example.com/example.PNG'
    
    sentance = '{f_txt} <a href="{f_url}">{f_url}</a> {s_txt} <img src="{s_url}">'
    
    f_txt, f_url, s_txt, s_url = stng.split()
    
    print(sentance.format(f_txt=f_txt, f_url=f_url, s_txt=s_txt, s_url=s_url))
    

    输出

    La-la-la <a href="https://example.com/">https://example.com/</a> la-la-la <img src="https://example.com/example.PNG"> 
    

    【讨论】:

    • 但是文本和链接的顺序是不确定和不可预测的
    【解决方案2】:

    您可以使用以下正则表达式:

    (https?.*?\.com\/)(\s+[\w-]*\s+)(https?.*?\.com\/[\w\.]+)

    • (https?.*?\.com\/) 第一个捕获组。捕获httphttps,直到.com 和正斜杠/
    • (\s+[\w-]*\s+) 第二个捕获组。捕获空格、字母数字字符和连字符以及空格。如果需要,您可以向字符集中添加更多字符。
    • (https?.*?\.com\/[\w\.]+) 第三个捕获组。捕获httphttps,直到.com,正斜杠/,字母数字字符和句号. 用于扩展。如果您需要其他字符,您可以再次向此捕获组中的字符集添加更多字符。

    您可以实时测试正则表达式here

    或者,如果您希望使用可变的 url 和域:

    (\w*\:.*?\.\w*\/)(\s+[\w-]*\s+)(\w*\:?.*?\.\w*\/[\w\.]+)

    现在,第一个和第三个捕获组确实匹配任何字母数字字符,后跟冒号 :,以及直到 .、字母数字字符 \w 和正斜杠的任何内容。你可以测试这个here

    您可以将捕获的组替换为:

    &lt;a href="\1"&gt;\1&lt;/a&gt;\2&lt;img src="\3"&gt;

    其中\1\2\3 分别是对捕获的第一组、第二组和第三组的反向引用。


    Python sn-p:

    >>import re
    >>str = "La-la-la https://example.com/ la-la-la https://example.com/example.PNG"
    
    >>out = re.sub(r'(https?.*?\.com\/)(\s+[\w-]*\s+)(https?.*?\.com\/[\w\.]+)',
           r'<a href="\1">\1</a>\2<img src="\3">',
           str)
    >>print(out)
    La-la-la <a href="https://example.com/">https://example.com/</a> la-la-la <img src="https://example.com/example.PNG">
    

    【讨论】:

    • 文本和链接的顺序是不确定的和不可预测的,它不仅可以是.com,也可以是.httpS等:)
    • 好吧,试试(\w*\:.*?\.\w*\/)(\s+[\w-]*\s+)(\w*\:?.*?\.\w*\/[\w\.]+)here。如果此解决方案不适合您,您能否提供最后一个正则表达式失败的示例?
    猜你喜欢
    • 2011-11-20
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多