当前位置 : 主页 > 编程语言 > python >

写给朋友的 Python知识点,正则表达式

来源:互联网 收集:自由互联 发布时间:2022-06-15
Python 正则表达式是什么 学习 Python 正则表达式离不开 re 模块,所以本篇博客会配合 re 模块进行编写。 re 库是 Python 中处理正则表达式的标准库,本篇博客介绍 re 库的同时,会简单介绍

Python 正则表达式是什么

学习 Python 正则表达式离不开 re 模块,所以本篇博客会配合 re 模块进行编写。

re 库是 Python 中处理正则表达式的标准库,本篇博客介绍 re 库的同时,会简单介绍一下正则表达式语法,如果想深入学习正则表达式,还需要好好下一番功夫。

怎么用

正则表达式语法

正则表达式语法由字符和操作符构成,初期阶段掌握下述这些内容即可。

操作符 说明 例子 . 任何单个字符,极少不能匹配 [] 字符集,对单个字符给出取值范围 [abc] 表示匹配 a、b、c,[a-z] 表示 a 到 z 单个字符 [\^] 非字符集,对单个字符给出排除范围 [\^abc] 表示匹配 非 a、非 b、非 c 的单个字符 * 前一个字符 0 次或无限次扩展 abc* 表示 ab、abc、abcc、abccc 等 + 前一个字符 1 次或无限次扩展 abc+ 表示 abc、abcc、abccc 等 ? 前一个字符 0 次或 1 次 abc? 表示 ab、abc | 左右表达式任意一个 abc|def 表示 abc 或者 def {m} 扩展前 1 个字符 m 次 ab{2}c,表示 abbc {m,n} 扩展前 1 个字符 m 到 n 次 ab{1,2}c,表示 abc、abbc \^ 匹配字符串开头 \^abc 表示 abc 在字符串开头 \$ 匹配字符串结尾 abc$ 表示 abc 在字符串结尾 () 分组标记,内部仅能使用 | 操作符 (abc) 表示 abc,(a b) 表示 a、b \d 数字,等价于 [0-9] \w 字符,等价于 [A-Za-z0-9]

以上表示仅仅为正则表达最基础部分内容,如果希望深入研究正则表达式,建议寻找更加全面的资料进行学习,本文只做药引。

re 库基本用法

re 库主要函数如下:

  • 基础函数:compile;
  • 功能函数:search、match、findall、split、finditer、sub。

在正式学习之前,先了解一下原生字符串。

在 Python 中,表示原生字符串,需要在字符串前面加上 r。例如 my_str = 'i'am xiangpica' 在程序中会直接报错,如果希望字符串中 ' 可以正常运行,需要加上转移字符 \,修改为 my_str = 'i\'am xiangpica'。但这样结合上文正则表达式中的操作符,就会出现问题,因为 \ 在正则表达式中是有真实含义的,如果你使用 re 库去匹配字符串中的 \,那需要使用 4 个反斜杠,为了避免这种情况出现,引入了原生字符串概念。

# 不使用原生字符串的正则表达式 "\\\\" # 使用原生字符串的正则表达式 r"\\"

在后文会有实际的应用。

接下来在学习一个案例,例如下述代码:

my_str='C:\number' print(my_str) C: umber

本段代码的输出效果如下,\n 被解析成了换行,如果想要屏蔽这种现象,使用 r 即可:

my_str=r'C:\number' print(my_str)

输出 C:\number。

re.search 函数

该函数用于,在字符串中搜索正则表达式匹配到的第一个位置的值,返回 match 对象。函数原型如下:

re.search(pattern,string,flags=0)

需求:在字符串 梦想橡皮擦 good good 中匹配 橡皮擦。

import re my_str='梦想橡皮擦 good good' pattern = r'橡皮擦' ret = re.search(pattern,my_str) print(ret)

返回结果:<re.Match object; span=(2, 5), match='橡皮擦'>。

search 函数的第三个参数 flags 表示正则表达式使用时的控制标记。

  • re.I,re.IGNORECASE:忽略正则表达式的大小写;
  • re.M,re.MULTILINE:正则表达式中的 \^ 操作符能够将给定字符串的每行当做匹配的开始;
  • re.S,re.DOTALL:正则表达式中的 . 操作符能够匹配所有字符。

最后将匹配到的字符串进行输出,使用下述代码即可实现。

import re my_str = '梦想橡皮擦 good good' pattern = r'橡皮擦' ret = re.search(pattern, my_str) if ret: print(ret.group(0))

re.match 函数

该函数用于在目标字符串开始位置去匹配正则表达式,返回 match 对象,未匹配成功返回 None,函数原型如下:

re.match(pattern,string,flags=0)

一定要注意是目标字符串开始位置。

import re my_str = '梦想橡皮擦 good good' pattern = r'梦' # 匹配到数据 pattern = r'good' # 匹配不到数据 ret = re.match(pattern, my_str) if ret: print(ret.group(0))

re.match 和 re.search 方法都是一次最多返回一个匹配对象,如果希望返回多个值,可以通过在 pattern 里加括号构造匹配组返回多个字符串。

re.findall 函数

该函数用于搜索字符串,以列表格式返回全部匹配到的字符串,函数原型如下:

re.findall(pattern,string,flags=0)

测试代码如下:

import re my_str = '梦想橡皮擦 good good' pattern = r'good' ret = re.findall(pattern, my_str) print(ret)

re.split 函数

该函数将一个字符串按照正则表达式匹配结果进行分割,返回一个列表。函数原型如下:

re.split(pattern, string, maxsplit=0, flags=0)

re.split 函数进行分割的时候,如果正则表达式匹配到的字符恰好在字符串开头或者结尾,返回分割后的字符串列表首尾都多了空格,需要手动去除,例如下述代码:

import re my_str = '1梦想橡皮擦1good1good1' pattern = r'\d' ret = re.split(pattern, my_str) print(ret)

运行结果:

['', '梦想橡皮擦', 'good', 'good', '']

切换为中间的内容,则能正确的分割字符串。

import re my_str = '1梦想橡皮擦1good1good1' pattern = r'good' ret = re.split(pattern, my_str) print(ret)

如果在 pattern 中捕获到括号,那括号中匹配到的结果也会在返回的列表中。

import re my_str = '1梦想橡皮擦1good1good1' pattern = r'(good)' ret = re.split(pattern, my_str) print(ret)

运行结果,你可以对比带括号和不带括号的区别进行学习:

['1梦想橡皮擦1', 'good', '1', 'good', '1']

maxsplit 参数表示最多进行分割次数, 剩下的字符全部返回到列表的最后一个元素,例如设置匹配 1 次,得到的结果是 ['1梦想橡皮擦1', '1good1']。

re.finditer 函数

搜索字符串,并返回一个匹配结果的迭代器,每个迭代元素都是 match 对象。函数原型如下:

re.finditer(pattern,string,flags=0)

测试代码如下:

import re my_str = '1梦想橡皮擦1good1good1' pattern = r'good' # ret = re.split(pattern, my_str,maxsplit=1) ret =re.finditer(pattern, my_str) print(ret)

re.sub 函数

在一个字符串中替换被正则表达式匹配到的字符串,返回替换后的字符串,函数原型如下:

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

其中 repl 参数是替换匹配字符串的字符串,count 参数是匹配的最大替换次数。

import re my_str = '1梦想橡皮擦1good1good1' pattern = r'good' ret = re.sub(pattern, "nice", my_str) print(ret)

运行之后,得到替换之后的字符串:

1梦想橡皮擦1nice1nice1

re 库其它函数

其它比较常见的函数有:re.fullmatch(),re.subn(),re.escape(),更多内容可以查阅 官方文档,获取一手资料。

扩展知识

使用 re 库匹配字符串之后,会返回 match 对象,该对象具备以下属性和方法。

你可以顺着这条线继续学习下去。

网友评论