re.sub()用法详解
发布日期:2021-05-07 08:25:30 浏览次数:31 分类:精选文章

本文共 7033 字,大约阅读时间需要 23 分钟。

re.sub()用法详解

源代码、参数及其意义:

def sub(pattern, repl, string, count=0, flags=0):    """Return the string obtained by replacing the leftmost    non-overlapping occurrences of the pattern in string by the    replacement repl.  repl can be either a string or a callable;    if a string, backslash escapes in it are processed.  If it is    a callable, it's passed the Match object and must return    a replacement string to be used."""    return _compile(pattern, flags).sub(repl, string, count)

从源码中看出re.sub()函数共有5个参数:

  • pattern:表示正则中的模式字符串;
  • repl:表示要替换的字符串(即匹配到pattern后替换为repl),也可以是个函数;
  • string:表示要被处理(查找替换)的原始字符串;
  • count:可选参数,表示要替换的最大次数,而且必须是非负整数,该参数默认为0,即所有的匹配都会替换;
  • flags:可选参数,表示编译时用的匹配模式(如忽略大小写、多行模式等),数字形式,默认为0。

案例分析:

一个字符串(包含大小写英文、数字、中英文标点、特殊符号等)

s = "大家好,我是一个程序员小白。I 'm so glad to introduce myself, and I’m 18 years old.   Today is 2020/01/01. It is a wonderful DAY! @HHHHello,,,#111ComeHere222...66?AA?zz?—http://welcome.cn"

1.匹配单个数字或字母

(1)只匹配单一数字

import res = "大家好,我是一个程序员小白。I 'm so glad to introduce myself, and I’m 18 years old.   Today is 2020/01/01. It is a wonderful DAY! @HHHHello,,,#111ComeHere222...66?AA?zz?—http://welcome.cn"#  只匹配单一数字ret = re.sub(r'[0-9]', "*", s)print(ret)

运行结果:

上面 re.sub(r'[0-9]', '*', s) 这句话则表示只匹配单一数字,并将每一个数字替换为一个星号 。

(2)只匹配单一字母

import res = "大家好,我是一个程序员小白。I 'm so glad to introduce myself, and I’m 18 years old.   Today is 2020/01/01. It is a wonderful DAY! @HHHHello,,,#111ComeHere222...66?AA?zz?—http://welcome.cn"#  只匹配单一字母ret = re.sub(r'[a-z]', "*", s)print(ret)ret = re.sub(r'[A-Z]', "*", s)print(ret)ret = re.sub(r'[a-zA-Z]', "*", s)print(ret)ret = re.sub(r'[A-z]', "*", s)print(ret)

运行结果:

上面 re.sub(r'[a-z]', '*', s) 这句话则表示只匹配单一小写字母,并将每一个小写字母替换为一个星号 。

上面 re.sub(r'[A-Z]', '*', s) 这句话则表示只匹配单一大写字母,并将每一个大写字母替换为一个星号 。
上面 re.sub(r'[A-Za-z]', '*', s) 这句话则表示只匹配单一字母,并将每一个字母替换为一个星号 。
(3)匹配单一数字和字母

import res = "大家好,我是一个程序员小白。I 'm so glad to introduce myself, and I’m 18 years old.   Today is 2020/01/01. It is a wonderful DAY! @HHHHello,,,#111ComeHere222...66?AA?zz?—http://welcome.cn"#  匹配单一数字和字母ret = re.sub(r'[0-9a-z]', "*", s)print(ret)ret = re.sub(r'[0-9A-Z]', "*", s)print(ret)ret = re.sub(r'[0-9a-zA-Z]', "*", s)print(ret)ret = re.sub(r'[0-9A-z]', "*", s)print(ret)

运行结果:

上面 re.sub(r'[0-9A-Z]', '*', s) 这句话则表示只匹配单一数字和大写字母,并将每一个数字和大写字母替换为一个星号 。

上面 re.sub(r'[0-9a-z]', '*', s) 这句话则表示只匹配单一数字和小写字母,并将每一个数字和小写字母替换为一个星号 。
上面 re.sub(r'[0-9A-Za-z]', '*', s) 这句话则表示只匹配单一数字和字母,并将每一个数字和字母替换为一个星号 。

2.匹配多个数字或字母

注意:这里的所说的多个指的是大于等于一个。

(1)匹配多个数字

import res = "大家好,我是一个程序员小白。I 'm so glad to introduce myself, and I’m 18 years old.   Today is 2020/01/01. It is a wonderful DAY! @HHHHello,,,#111ComeHere222...66?AA?zz?—http://welcome.cn"#  匹配多个数字ret = re.sub(r'[0-9]+', "*", s)print(ret)

运行结果:

上面 re.sub(r'[0-9]+', '*', s) 这句话则表示匹配多个连续的数字,并将多个连续的数字替换为一个星号 。

(2)匹配多个字母

import res = "大家好,我是一个程序员小白。I 'm so glad to introduce myself, and I’m 18 years old.   Today is 2020/01/01. It is a wonderful DAY! @HHHHello,,,#111ComeHere222...66?AA?zz?—http://welcome.cn"#  匹配多个字母ret = re.sub(r'[a-z]+', "*", s)print(ret)ret = re.sub(r'[A-Z]+', "*", s)print(ret)ret = re.sub(r'[a-zA-Z]+', "*", s)print(ret)

运行结果:

上面 re.sub(r'[a-z]+', '*', s) 这句话则表示匹配多个连续的小写字母,并将多个连续的小写字母替换为一个星号 。

上面 re.sub(r'[A-Z]+', '*', s) 这句话则表示匹配多个连续的大写字母,并将多个连续的大写字母替换为一个星号 。
上面 re.sub(r'[A-Za-z]+', '*', s) 这句话则表示匹配多个连续的字母,并将多个连续的字母替换为一个星号 。
(3)匹配多个数字和字母

import res = "大家好,我是一个程序员小白。I 'm so glad to introduce myself, and I’m 18 years old.   Today is 2020/01/01. It is a wonderful DAY! @HHHHello,,,#111ComeHere222...66?AA?zz?—http://welcome.cn"#  匹配多个数字和字母ret = re.sub(r'[0-9a-zA-Z]+', "*", s)print(ret)

运行结果:

上面 re.sub(r'[0-9A-Za-z]+', '*', s) 这句话则表示匹配多个连续的数字和字母,并将多个连续的数字、连续的字母、连续的数字和字母替换为一个星号 。

3.匹配其他

(1)匹配非数字

import res = "大家好,我是一个程序员小白。I 'm so glad to introduce myself, and I’m 18 years old.   Today is 2020/01/01. It is a wonderful DAY! @HHHHello,,,#111ComeHere222...66?AA?zz?—http://welcome.cn"#  匹配非数字ret = re.sub(r'[^0-9]', "*", s)print(ret)ret = re.sub(r'[^0-9]+', "*", s)print(ret)

运行结果:

上面 re.sub(r'[^0-9]', '*', s) 这句话则表示匹配单个非数字,并将单个非数字替换为一个星号 。

上面 re.sub(r'[^0-9]+', '*', s) 这句话则表示匹配多个连续的非数字,并将多个连续的非数字替换为一个星号 。

(2)匹配非字母

import res = "大家好,我是一个程序员小白。I 'm so glad to introduce myself, and I’m 18 years old.   Today is 2020/01/01. It is a wonderful DAY! @HHHHello,,,#111ComeHere222...66?AA?zz?—http://welcome.cn"#  匹配非字母ret = re.sub(r'[^a-z]', "*", s)print(ret)ret = re.sub(r'[^A-Z]', "*", s)print(ret)ret = re.sub(r'[^a-zA-Z]', "*", s)print(ret)ret = re.sub(r'[^a-z]+', "*", s)print(ret)ret = re.sub(r'[^A-Z]+', "*", s)print(ret)ret = re.sub(r'[^a-zA-Z]+', "*", s)print(ret)

运行结果:

上面 re.sub(r'[^a-z]', '*', s) 这句话则表示匹配单个非小写字母,并将单个非小写字母替换为一个星号 。

上面 re.sub(r'[^A-Z]', '*', s) 这句话则表示匹配单个非大写字母,并将单个非大写字母替换为一个星号 。
上面 re.sub(r'[^A-Za-z]', '*', s) 这句话则表示匹配单个非字母,并将单个非字母替换为一个星号 。
上面 re.sub(r'[^a-z]+', '*', s) 这句话则表示匹配多个连续的非小写字母,并将多个连续的非小写字母替换为一个星号 。
上面 re.sub(r'[^A-Z]+', '*', s) 这句话则表示匹配多个连续的非大写字母,并将多个连续的非大写字母替换为一个星号 。
上面 re.sub(r'[^A-Za-z]+', '*', s) 这句话则表示匹配多个连续的非字母,并将多个连续的非字母替换为一个星号 。
(3)匹配非数字和非字母

import res = "大家好,我是一个程序员小白。I 'm so glad to introduce myself, and I’m 18 years old.   Today is 2020/01/01. It is a wonderful DAY! @HHHHello,,,#111ComeHere222...66?AA?zz?—http://welcome.cn"#  匹配非数字和非字母ret = re.sub(r'[^0-9a-zA-Z]', "*", s)print(ret)ret = re.sub(r'[^0-9a-zA-Z]+', "*", s)print(ret)

运行结果:

上面 re.sub(r'[^0-9A-Za-z]', '*', s) 这句话则表示匹配单个非数字和非字母,并将单个非数字和非字母替换为一个星号 。

上面 re.sub(r'[^0-9A-Za-z]+', '*', s) 这句话则表示匹配多个连续的非数字和非字母,并将多个连续的非数字和非字母替换为一个星号 。

(4)匹配固定形式

a.只保留字母和空格,将 repl 设置为空字符即可。

import res = "大家好,我是一个程序员小白。I 'm so glad to introduce myself, and I’m 18 years old.   Today is 2020/01/01. It is a wonderful DAY! @HHHHello,,,#111ComeHere222...66?AA?zz?—http://welcome.cn"#  匹配固定形式ret = re.sub(r'[^a-z ]', " ", s)print(ret)ret = re.sub(r'[^a-z ]+', " ", s)print(ret)ret = re.sub(r'[^a-zA-Z ]', " ", s)print(ret)ret = re.sub(r'[^a-zA-Z ]+', " ", s)print(ret)

运行结果:

如果要使句子语义和结构更完整,则要先将其余字符替换为空格(即repl设置为空格),然后去除多余的空格,如下:

import res = "大家好,我是一个程序员小白。I 'm so glad to introduce myself, and I’m 18 years old.   Today is 2020/01/01. It is a wonderful DAY! @HHHHello,,,#111ComeHere222...66?AA?zz?—http://welcome.cn"ret = re.sub(r'[^a-zA-Z ]+', " ", s)print(ret)ret1 = re.sub(r'[ ]+', " ", ret)print(ret1)

运行结果:

b.去除以 @ 开头的英文单词

import res = "大家好,我是一个程序员小白。I 'm so glad to introduce myself, and I’m 18 years old.   Today is 2020/01/01. It is a wonderful DAY! @HHHHello,,,#111ComeHere222...66?AA?zz?—http://welcome.cn"#  去除以 @ 开头的英文单词ret = re.sub(r'@[a-zA-Z ]+', " ", s)print(ret)

运行结果:

c.去除以 ?结尾的英文单词和数字(注意中英文问号)

import res = "大家好,我是一个程序员小白。I 'm so glad to introduce myself, and I’m 18 years old.   Today is 2020/01/01. It is a wonderful DAY! @HHHHello,,,#111ComeHere222...66?AA?zz?—http://welcome.cn"#  去除以 ?结尾的英文单词和数字ret = re.sub(r'[0-9a-zA-Z ]+?', "", s)print(ret)

运行结果:

d.去除原始字符串中的URL

import res = "大家好,我是一个程序员小白。I 'm so glad to introduce myself, and I’m 18 years old.   Today is 2020/01/01. It is a wonderful DAY! @HHHHello,,,#111ComeHere222...66?AA?zz?—http://welcome.cn"#  d.去除原始字符串中的URLret = re.sub(r'http[:.]+\S+', "", s)print(ret)

运行结果:

 

上一篇:2021年安全员-A证-主要负责人(广东省)最新解析及安全员-A证-主要负责人(广东省)找解析
下一篇:2021年安全员-B证(陕西省)考试APP及安全员-B证(陕西省)找解析

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2025年04月09日 19时56分15秒