Python中需要处理html中引用的图片文件或链接地址时,可能需要提取替换成新路径,换成新域名等情况。本文主要介绍Python 中使用正则表达式提取替换img(src)或a(href)标签的url地址的方法,以及相关的示例代码。

1、正则表达式

参考文档:Python 正则表达式(RegEx)

2、使用正则表达式提取替换字符串

参考文档Python 正则表达式分组匹配提取替换字符串(回调函数)

3、re.sub(pattern, repl, string, count=0, flags=0)

Python中实现正则表达式提取替换,需要使用re.sub(),具体参数说明如下:

1)pattern参数

pattern是正则表达式字符串。字符串前一般加r。

参考文档:Python 字符串前r、b、u和f的前缀作用及用法

2)repl参数

repl是被替换成的内容,可以是字符串,也可以是函数。字符串匹配后直接替换,函数则会每次匹配的字符串会调用执行进行处理。

3)string参数

string表示要被处理,要被替换的字符串。

4)count参数

count是匹配替换的次数

5)flags参数

IGNORECASE(简写I),匹配对大小写不敏感。

LOCALE(简写L),locales是C语言库中的一项功能,是用来为需要考虑不同区域语言的编程提供帮助的。

MULTILINE(简写M),^匹配字符串的开始和字符串中每行的开始。同样的, $元字符匹配字符串结尾和字符串中每行的结尾。

DOTALL(简写S),此模式下.的匹配不受限制,可匹配任何字符,包括换行符,但默认是不能匹配换行符。

VERBOSE(简写X),冗余模式, 此模式忽略正则表达式中的空白和#号的注释。

4、使用正则表达式提取替换img(src)或a(href)标签的url

使用正则表达式提取替换html中标签的url代码示例,如下,

# -*- coding: utf-8 -*-
import re
def replace_num(str):
  print("--------------")  
  print(str.group())  
  print(str.group(1))#匹配到的第1个分组
  #print(str.group(2))#匹配到的第2个分组
  print("--------------") 
  return ""
my_str = '''<p><strong>1、JDK11安装</strong></p><p>1)
<span class=\"text-info\">下载JDK11</span></p><p
>Oracle JDK11: <a href=\"https://www.example.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html\" rel=\"nofollow\">https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html</a></p><p>OpenJDK11: 
<a href=\"https://www.example.com/11/\" rel=\"nofollow\">http://jdk.java.net/11/</a></p><p>在上面两个地址下载需要的版本。
</p><p>本文主要是64位win10上安装,文件下载地址:<a href=\"https://download.java.net/openjdk/jdk11/ri/openjdk-11+28_windows-x64_bin.zip\" rel=\"nofollow\">https://download.java.net/openjdk/jdk11/ri/openjdk-11+28_windows-x64_bin.zip</a></p><p>2)
<span class=\"text-info\">解压下载文件</span></p><p>将下载好的.zip文件解压到指定的安装目录,例如,安装到C:\\Program Files\\Java下,在Java文件夹下新建jdk11文件夹,将文件解压到jdk11文件夹下。
</p><p><span class=\"text-warning\">注意:zip文件解压后,JDK中bin文件夹应该在jdk11文件夹下。</span></p>
<p>如果下载的是exe文件,就选择安装目录为新建好的那个JDK11文件夹下。</p><p><strong>2、配置环境变量</strong></p>
p>1)<span class=\"text-info\">配置JAVA_HOME</span></p>
<p>按Windows键+R键,出现运行窗口,在打开文件框中输入sysdm.cpl,点击确定,出现\"系统信息\"窗口。</p><p>在系统信息窗口依次点击,</p>
<p><span class=\"text-primary\">系统信息窗口 =》高级 =》环境变量-》系统环境变量</span> 
, 注意:如果用户环境变量中有对应的环境变量设置,就在用户环境变量中添加。否则会优先读取用户环境,有可能找不到设置的环境变量。如果没有,在系统环境变量或用户环境哪一个都可以,系统环境变量是对所有用户生效的。</p>
<p><span class=\"text-primary\">点击环境变量-&gt;新建-&gt;变量名JAVA_HOME,变量值JDK11的安装目录如C:\\Program Files\\Java\\jdk11
</span></p>
<p><span class=\"text-primary\"><img alt=\"JAVA_HOME\" src=\"http://file.example.xyz/source/download?id=5bd1926bdc72d91ff8d53a12\"><br></span></p><p>2)<span class=\"text-info\">配置Path环境变量</span></p>
<p>编辑Path变量</p><p>把<br><span class=\"text-warning\">%JAVA_HOME%\\bin;<br></span>这个变量插入最前面,注意要有分号和后面的变量间隔开。
</p><p>注意:如果是win10系统,点击编辑后,要点击新建,值为<span class=\"text-warning\">%JAVA_HOME%\\bin</span>,win10系统中不用自己加冒包。</p><p></p><p></p><p><img alt=\"httpfileaionlifexyzsourcedownloadid5bd1bcd1dc72d91ff8d53a14\" src=\"http://file.example.xyz/source/download?id=5bd1bcd1dc72d91ff8d53a14\"></p><p></p>
<p>效果如下图,</p><p><img alt=\"Path\" src=\"http://file.example.xyz/source/download?id=5bd19298dc72d91ff8d53a13\" ><br></p>
<p>3)<span class=\"text-info\">验证是否安装成功</span></p>
<p><span class=\"text-primary\">按windows键+R键</span>,输入cmd,在打开的cmd窗口中输入<span class=\"text-info\">java -version</span>,安装成功提示如下:</p>
<pre class=\"prettyprint linenums\">Microsoft Windows [版本 10.0.17134.254]<br>(c) 2018 Microsoft Corporation。保留所有权利。<br>C:\\Users\\Administrator&gt;java -version<br>java version \"11.0.1\" 2018-10-16 LTS<br>Java(TM) SE Runtime Environment 18.9 (build 11.0.1+13-LTS)<br>Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.1+13-LTS, mixed mode)</pre>
'''
#a = re.sub(r'<pre class=\"prettyprint linenums\s*([a-z]*?)\"\s*>(.+?)</pre>', replace_num, my_str,flags=re.I|re.M|re.S)
img = re.sub(r'<img\s*alt=\".*?\"\s*src=\"(.*?)\"\s*?>', replace_num, my_str,flags=re.I|re.M|re.S)
#a = re.sub(r'<a\s*href=\"https://www.example.com/(.*?)\"\s*rel=\"nofollow\"\s*?>', replace_num, my_str,flags=re.I|re.M|re.S)
a = re.sub(r'<a\s*href=\"(.*?)\"\s*rel=\"nofollow\"\s*?>', replace_num, my_str,flags=re.I|re.M|re.S)
print(img)
print(a) #每次匹配一个数字,执行函数,获取替换后的值

推荐文档