python正则表达式re.sub各个参数的超详细讲解

目录
  • 一、re.sub(pattern, repl, string, count=0, flags=0)
  • 二、参数讲解
    • 1、pattern参数
    • 2、repl参数
      • 2.1、repl是字符串
      • 2.2、repl是函数
    • 3、string参数
    • 4、count参数
    • 5、flags参数
      • 5.1、IGNORECASE(简写I)
      • 5.2、LOCALE(简写L)
      • 5.3、MULTILINE(简写M)
      • 5.4、DOTALL(简写S)
      • 5.5、VERBOSE(简写X)
  • 补充:repl为函数时的用法
  • 总结

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

re是正则的表达式,sub是substitute,表示替换

re.sub共有五个参数。

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

其中三个必选参数:pattern, repl, string

两个可选参数:count, flags

二、参数讲解

1、pattern参数

pattern,表示正则中的模式字符串,这个没太多要解释的。

需要知道的是:

反斜杠加数字:\N,则对应着匹配的组:matched group

比如\6,表示匹配前面pattern中的第6个group

意味着,pattern中,前面肯定是存在对应的组,后面也才能去引用

举个例子

hello xinfa, nihao xinfa

我们想把xinfa替换成linxinfa,就可以这样:

import re

inputStr = "hello xinfa, nihao xinfa"
replacedStr = re.sub(r"hello (\w+), nihao \1", "linxinfa", inputStr)
print("replacedStr = ", replacedStr)
#输出结果为: replacedStr = linxinfa

注意,上面的(\w+),括号括起来表示一个组;

里面的\w表示匹配字母、数字、下划线,等价于[A-Za-z0-9_]

然后+表示匹配前面的子表达式一次或多次。

所以(\w+)就是匹配多个字母、数字、下划线的意思。表达式中的\1表示匹配第一个组,第一个组就是(\w+)

2、repl参数

repl,就是replacement,被替换的字符串的意思。

repl可以是字符串,也可以是函数。

2.1、repl是字符串

如果repl是字符串的话,其中的任何反斜杠转义字符,都会被处理。

比如:

\n:会被处理为对应的换行符;

\r:会被处理为回车符;

其他不能识别的转移字符,则只是被识别为普通的字符: 比如\j,会被处理为j这个字母本身;

比较特殊的是\g<n>\g表示匹配组,n是组的id,比如\g<1>表示第一个组。

还是上面的例子,我们想把xinfa提取出来,只剩xinfa

hello xinfa, nihao xinfa

就可以这样写:

import re

inputStr = "hello xinfa, nihao xinfa"
replacedStr = re.sub(r"hello (\w+), nihao \1", "\g<1>", inputStr)
print("replacedStr = ", replacedStr)
#输出结果为: replacedStr = xinfa

2.2、repl是函数

比如输入内容是:

hello 123 world 456

想要把其中的数字部分,都加上111,变成:

hello 234 world 567

那么就可以这样:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import re;

def pythonReSubDemo():
    """
        demo Pyton re.sub
    """
    inputStr = "hello 123 world 456"

    def _add111(matched):
        intStr = matched.group("number")
        intValue = int(intStr)
        addedValue = intValue + 111
        addedValueStr = str(addedValue)
        return addedValueStr

    replacedStr = re.sub("(?P<number>\d+)", _add111, inputStr)
    print("replacedStr=",replacedStr)
    #输出结果为:replacedStr= hello 234 world 567

if __name__=="__main__":
    pythonReSubDemo()

注意上面,用了一个?P<value>

?P的意思就是命名一个名字为value的组,匹配规则符合后面的\d+

3、string参数

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

4、count参数

举例说明:

继续之前的例子,假如对于匹配到的内容,只处理其中一部分。

比如:

hello 123 world 456 nihao 789

我们只是想要处理前面两个数字:123,456,分别给他们加111,而不处理789

那么就可以这样:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import re;

def pythonReSubDemo():
    """
        demo Pyton re.sub
    """
    inputStr = "hello 123 world 456 nihao 789"

    def _add111(matched):
        intStr = matched.group("number")
        intValue = int(intStr)
        addedValue = intValue + 111
        addedValueStr = str(addedValue)
        return addedValueStr

    replacedStr = re.sub("(?P<number>\d+)", _add111, inputStr, 2)
    print("replacedStr = ", replacedStr)
	#输出结果为:replacedStr = hello 234 world 567 nihao 789

if __name__=="__main__":
    pythonReSubDemo()

5、flags参数

flags编译标志。编译标志让你可以修改正则表达式的一些运行方式。

re模块中标志可以使用两个名字,一个是全名如IGNORECASE,一个是缩写,一字母形式如I。(如果你熟悉 Perl 的模式修改,一字母形式使用同样的字母;例如re.VERBOSE的缩写形式是re.X。)

多个标志可以通过按位它们来指定。如re.I | re.M被设置成IM标志。

下面列举下常用的编译标志

5.1、IGNORECASE(简写I)

使匹配对大小写不敏感;

举个例子,[A-Z]也可以匹配小写字母,Spam可以匹配 Spam、spamspAM

5.2、LOCALE(简写L)

localesC语言库中的一项功能,是用来为需要考虑不同语言的编程提供帮助的。

举个例子,如果你正在处理法文文本,你想用 w+来匹配文字,但w只匹配字符类[A-Za-z],它并不能匹配é

如果你的系统配置适当且本地化设置为法语,那么内部的 C函数将告诉程序é也应该被认为是一个字母。

当在编译正则表达式时使用 LOCALE标志会得到用这些 C函数来处理 w后的编译对象,这会更慢,但也会象你希望的那样可以用w+来匹配法文文本。

5.3、MULTILINE(简写M)

MULTILINE多行的意思,改变 ^ 和 $ 的行为。

使用 ^只匹配字符串的开始,而 $则只匹配字符串的结尾和直接在换行前(如果有的话)的字符串结尾。

当本标志指定后,^匹配字符串的开始和字符串中每行的开始。同样的, $元字符匹配字符串结尾和字符串中每行的结尾(直接在每个换行之前)。

例如

import re

s='hello \nworld \nxinfa'
print(s)

pattern=re.compile(r'^\w+')
print(re.findall(pattern,s))

#加上flags=re.M
pattern=re.compile(r'^\w+', flags=re.M)
print(re.findall(pattern,s))

输出结果为

hello 
world 
xinfa
['hello']
['hello', 'world', 'xinfa']

5.4、DOTALL(简写S)

此模式下 .的匹配不受限制,可匹配任何字符,包括换行符,也就是默认是不能匹配换行符。

例:

 #!/usr/bin/python
# -*- coding: utf-8 -*-
import re

s = '''first line
    ...: second line
    ...: third line'''

regex=re.compile('.+')
print(regex.findall(s))

regex=re.compile('.+', re.S)
print(regex.findall(s))

输出结:

['first line', '    ...: second line', '    ...: third line']
['first line\n    ...: second line\n    ...: third line']

5.5、VERBOSE(简写X)

冗余模式, 此模式忽略正则表达式中的空白和#号的注释。
例:

email_regex = re.compile("[\w+\.]+@[a-zA-Z\d]+\.(com|cn)")

email_regex = re.compile("""[\w+\.]+  # 匹配@符前的部分
                            @  # @符
                            [a-zA-Z\d]+  # 邮箱类别
                            \.(com|cn)   # 邮箱后缀  """, re.X)

补充:repl为函数时的用法

当repl为函数时的替换更加灵活,此时可以在函数中自定义在某种特定的匹配下替换为某种特定的字符。

示例

import re

# 将匹配的数字乘以 2
def double(matched):
    print('matched: ',matched)
    print("matched.group('value'): ",matched.group('value'))
    value = int(matched.group('value'))
    return str(value * 2)

string = 'A23G4HFD567'
print(re.sub('(?P<value>\d+)', double, string))

总结

到此这篇关于python正则表达式re.sub各个参数的超详细讲解的文章就介绍到这了,更多相关python正则表达式re.sub参数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python 正则表达式 re.sub & re.subn

    python正则表达式模块简介 Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式.Python 1.5之前版本则是通过 regex 模块提供 Emacs 风格的模式.Emacs 风格模式可读性稍差些,而且功能也不强,因此编写新代码时尽量不要再使用 regex 模块,当然偶尔你还是可能在老代码里发现其踪影. 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.使用这个小型语言

  • Python正则替换字符串函数re.sub用法示例

    本文实例讲述了Python正则替换字符串函数re.sub用法.分享给大家供大家参考,具体如下: python re.sub属于python正则的标准库,主要是的功能是用正则匹配要替换的字符串 然后把它替换成自己想要的字符串的方法 re.sub 函数进行以正则表达式为基础的替换工作 下面是一段示例源码 #!/usr/bin/env python #encoding: utf-8 import re url = 'https://113.215.20.136:9011/113.215.6.77/c3

  • Python 正则表达式 re.match/re.search/re.sub的使用解析

    From Python正则表达式 re.match(pattern, string, flags=0) 尝试从字符串起始位置匹配一个模式:如果不是起始位置匹配成功,则 re.match() 返回none. 匹配成功,re.match() 返回一个匹配的对象,否则返回None. pattern - 匹配的正则表达式 string - 要匹配的字符串 flags - 标志位,控制正则表达式的匹配方式,如,是否区分大小写,多行匹配等. e.g. #!/usr/bin/python # -*- codi

  • python re.sub()替换正则的匹配内容方法

    如下所示: import re c = re.compile(r'\d') s = 'you1are2welcome' # 用指定的内容,替换正则匹配的内容,也可以指定替换次数 ret = c.sub(' ', s, 1) print(ret) # 处理函数接收一个参数(每次的匹配结果) def deal(s): return str(int(s.group()) * 2) # 可以认为干预替换过程,传递一个函数即可 ret = re.sub(r'\d', deal, 'you1are2welc

  • python正则表达式re.sub各个参数的超详细讲解

    目录 一.re.sub(pattern, repl, string, count=0, flags=0) 二.参数讲解 1.pattern参数 2.repl参数 2.1.repl是字符串 2.2.repl是函数 3.string参数 4.count参数 5.flags参数 5.1.IGNORECASE(简写I) 5.2.LOCALE(简写L) 5.3.MULTILINE(简写M) 5.4.DOTALL(简写S) 5.5.VERBOSE(简写X) 补充:repl为函数时的用法 总结 一.re.su

  • Python进程间通讯与进程池超详细讲解

    目录 进程间通讯 队列Queue 管道Pipe 进程池Pool 在<多进程并发与同步>中介绍了进程创建与信息共享,除此之外python还提供了更方便的进程间通讯方式. 进程间通讯 multiprocessing中提供了Pipe(一对一)和Queue(多对多)用于进程间通讯. 队列Queue 队列是一个可用于进程间共享的Queue(内部使用pipe与锁),其接口与普通队列类似: put(obj[, block[, timeout]]):插入数据到队列(默认阻塞,且没有超时时间): 若设定了超时且

  • 超详细讲解python正则表达式

    目录 正则表达式 1.1 正则表达式字符串 1.1.1 元字符 1.1.2 字符转义 1.1.3 开始与结束字符 1.2 字符类 1.2.1 定义字符类 1.2.2 字符串取反 1.2.3 区间 1.2.4 预定义字符类 1.3 量词 1.3.1 量词的使用 1.3.2 贪婪量词和懒惰量词 1.4 分组 1.4.1 分组的使用 1.4.2 分组命名 1.4.3 反向引用分组 1.4.4 非捕获分组 1.5 re模块 1.5.1 search()和match()函数 1.5.2 findall()

  • Python 数据可视化超详细讲解折线图的实现

    绘制简单的折线图 在使用matplotlib绘制简单的折线图之前首先需要安装matplotlib,直接在pycharm终端pip install matplotlib即可 使用matplotlib绘制简单的折线图,再对其进行定制,实现数据的可视化操作 import matplotlib.pyplot as plt # 导入pyplot模块并设置别名为plt squares = [1, 4, 9, 16, 25] plt.plot(squares) plt.show() # 打开matplotib

  • Python OpenCV超详细讲解读取图像视频和网络摄像头

    0.准备工作 右击新建的项目,选择Python File,新建一个Python文件,然后在开头import cv2导入cv2库. 1.读取图像调用imread()方法获取我们资源文件夹中的图片使用imshow()方法显示图片,窗口名称为OutputwaitKey(0)这句可以让窗口一直保持,如果去掉这句,窗口会一闪而过 我们来看下效果: 2.读取视频VideoCapture()方法的参数就是视频文件循环中通过read不断地去读视频的每一帧,再通过imshow显示出来最后if语句代表按q可以退出程

  • Python OpenCV超详细讲解基本功能

    目录 准备工作 转成灰度图像 高斯模糊 边缘检测 膨胀运算 腐蚀运算 准备工作 右击新建的项目,选择Python File,新建一个Python文件,然后在开头import cv2导入cv2库. 转成灰度图像 调用imread()方法获取我们资源文件夹中的图片lena.png cvtColor()方法可以让我们的图片转换成任意颜色,第一个参数是我们要转换的图片,第二个参数是要转成的颜色空间,cv2.COLOR_BGR2GRAY就是由BGR变为GRAY,我们日常生活中都是RGB三通道顺序,而在Op

  • Python OpenCV超详细讲解调整大小与图像操作的实现

    目录 准备工作 重新调整图像大小 图像裁剪 准备工作 右击新建的项目,选择Python File,新建一个Python文件,然后在开头import cv2导入cv2库. 我们还要知道在OpenCV中,坐标轴的方向是x轴向右,y轴向下,坐标原点在左上角,比如下面这张长为640像素,宽为480像素的图片.OK,下面开始本节的学习吧. 查看图像大小 调用imread()方法获取我们资源文件夹中的图片lambo.png 输出图像的shape属性 img=cv2.imread("Resources/lam

  • Python OpenCV超详细讲解图像堆叠的实现

    目录 准备工作 水平堆叠 垂直堆叠 图像栈堆叠 准备工作 右击新建的项目,选择Python File,新建一个Python文件,然后在开头import cv2导入cv2库,import numpy并且重命名为np. import cv2 import numpy as np 我们还要知道在OpenCV中,坐标轴的方向是x轴向右,y轴向下,坐标原点在左上角,比如下面这张长为640像素,宽为480像素的图片.OK,下面开始本节的学习吧. 水平堆叠 调用np的hstack()水平堆栈方法,参数是我们要

  • Python OpenCV超详细讲解图像堆叠的实现

    目录 准备工作 水平堆叠 垂直堆叠 图像栈堆叠 准备工作 右击新建的项目,选择Python File,新建一个Python文件,然后在开头import cv2导入cv2库,import numpy并且重命名为np. import cv2 import numpy as np 我们还要知道在OpenCV中,坐标轴的方向是x轴向右,y轴向下,坐标原点在左上角,比如下面这张长为640像素,宽为480像素的图片.OK,下面开始本节的学习吧. 水平堆叠 调用np的hstack()水平堆栈方法,参数是我们要

  • 超详细讲解SpringBoot参数校验实例

    目录 使用传统方式的弊端 引入依赖 注解说明 一.对实体类进行校验 1.entity 2.controller 3.编写全局统一异常处理 二.针对单个参数进行校验 三.分组校验 1.entity 2.controller 四.自定义分组校验 1.entity 2.CustomSequenceProvider 3.controller 五.自定义校验 1.定义校验注解 2.实现注解 六.嵌套校验 七.快速失败 注意事项 总结 使用传统方式的弊端 public String addUser(User

随机推荐