代码之家  ›  专栏  ›  技术社区  ›  MaxCore

Python Regex:用<img>和<a>标记替换字符串中的所有url

  •  2
  • MaxCore  · 技术社区  · 6 年前

    我有一个包含许多指向某些页面和图像的URL的字符串:

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

    我需要把它转换成:

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

    .png .JPEG 等等,任何链接都可以在每个字符串中找到多次

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

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   Druta Ruslan    6 年前

    你可以不用 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
  •  1
  •   Paolo Enigma    6 年前

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

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

    • (https?.*?\.com\/) 第一个捕获组。捕获 http https ,有什么事吗 .com /
    • (\s+[\w-]*\s+) 第二个捕获组。捕获空格、字母数字字符和hypens以及空格。如果需要,可以向字符集添加更多字符。
    • (https?.*?\.com\/[\w\.]+) 第三捕获组。捕获 http协议 ,正斜杠 / ,字母数字字符和句号 . 为了分机。同样,如果您需要其他字符,可以将更多字符添加到此捕获组中的字符集。

    here .

    或者,如果您需要可变的URL和域,则可以使用:

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

    其中第一个和第三个捕获组现在确实匹配任何后跟冒号的字母数字字符 : ,以及任何高达 . ,字母数字字符 \w here .

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

    <a href="\1">\1</a>\2<img src="\3">

    在哪里? \1 \2 ,和 \3 分别是对第一组、第二组和第三组的反向引用。


    Python代码段:

    >>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">