- Python 基础知识
- Python - 主页
- Python - 概述
- Python - 历史
- Python - 特性
- Python 与 C++
- Python——Hello World 程序
- Python - 应用领域
- Python解释器
- Python-环境设置
- Python-虚拟环境
- Python - 基本语法
- Python - 变量
- Python - 数据类型
- Python - 类型转换
- Python - Unicode 系统
- Python - 文字
- Python - 运算符
- Python - 运算符优先级
- Python - 算术运算符
- Python - 赋值运算符
- Python - 增强运算符
- Python - 比较运算符
- Python - 逻辑运算符
- Python - 位运算符
- Python - 会员运算符
- Python - 身份运算符
- Python - 注释
- Python - 用户输入
- Python - 数字
- Python - 布尔值
- Python 控制语句
- Python - 控制流
- Python - 决策
- Python - 如果有的话
- Python - 大小写匹配语句
- Python - for 循环
- Python - for-else 循环
- Python - While 循环
- Python-break语句
- Python-继续语句
- Python - pass 语句
- Python 函数和模块
- Python - 函数
- Python - 默认参数
- Python - 关键字参数
- Python - 仅关键字参数
- Python - 位置参数
- Python - 仅位置参数
- Python - 任意参数
- Python - 变量作用域
- Python - 函数注释
- Python - 模块
- Python - 内置函数
- Python 字符串
- Python-字符串
- Python - 字符串切片
- Python-修改字符串
- Python-字符串连接
- Python——字符串格式化
- Python - 转义字符
- Python - 字符串方法
- Python - 弦乐练习
- Python 列表
- Python - 列表
- Python - 访问列表项
- Python - 更改列表项
- Python - 添加列表项
- Python - 删除列表项
- Python - 循环列表
- Python - 列表理解
- Python - 列表排序
- Python - 复制列表
- Python - 连接列表
- Python - 列表方法
- Python - 列出练习
- Python 元组
- Python - 元组
- Python - 访问元组项
- Python - 更新元组
- Python - 解压元组
- Python - 循环元组
- Python - 连接元组
- Python - 元组方法
- Python - 元组练习
- Python 集
- Python - 集合
- Python - 访问设置项
- Python - 添加设置项
- Python - 删除设置项
- Python - 循环集
- Python - 连接集
- Python - 复制集
- Python - 集合运算符
- Python - 设置方法
- Python - 设置练习
- Python 字典
- Python - 字典
- Python - 访问字典项目
- Python - 更改字典项目
- Python - 添加字典项
- Python - 删除字典项
- Python - 字典查看对象
- Python - 循环字典
- Python - 复制字典
- Python - 嵌套字典
- Python - 字典方法
- Python - 字典练习
- Python 数组
- Python-数组
- Python - 访问数组项
- Python - 添加数组项
- Python - 删除数组项
- Python - 循环数组
- Python - 复制数组
- Python - 反转数组
- Python - 数组排序
- Python - 连接数组
- Python - 数组方法
- Python - 数组练习
- Python 文件处理
- Python - 文件处理
- Python-写入文件
- Python-读取文件
- Python - 重命名和删除文件
- Python - 目录
- Python - 文件方法
- Python - 操作系统文件/目录方法
- 面向对象编程
- Python - OOP 概念
- Python - 对象和类
- Python - 类属性
- Python - 类方法
- Python - 静态方法
- Python - 构造函数
- Python - 访问修饰符
- Python——继承
- Python——多态性
- Python - 方法重写
- Python - 方法重载
- Python - 动态绑定
- Python - 动态类型
- Python - 抽象
- Python-封装
- Python - 接口
- Python - 包
- Python - 内部类
- Python - 匿名类和对象
- Python-单例类
- Python - 包装类
- Python-枚举
- Python-反射
- Python 错误与异常
- Python - 语法错误
- Python - 异常
- Python - try- except 块
- Python - try-finally 块
- Python - 引发异常
- Python - 异常链
- Python - 嵌套 try 块
- Python - 用户定义的异常
- Python-日志记录
- Python-断言
- Python - 内置异常
- Python 多线程
- Python-多线程
- Python-线程生命周期
- Python - 创建线程
- Python - 启动线程
- Python - 连接线程
- Python - 命名线程
- Python-线程调度
- Python-线程池
- Python - 主线程
- Python-线程优先级
- Python - 守护线程
- Python - 同步线程
- Python同步
- Python-线程间通信
- Python-线程死锁
- Python - 中断线程
- Python 网络
- Python-网络
- Python-套接字编程
- Python-URL 处理
- Python - 泛型
- Python 杂项
- Python - 日期和时间
- Python - 数学
- Python - 迭代器
- Python - 生成器
- Python - 闭包
- Python - 装饰器
- Python - 递归
- Python - 正则表达式
- Python-PIP
- Python-数据库访问
- Python - 弱引用
- Python-序列化
- Python - 模板
- Python - 输出格式
- Python-性能测量
- Python-数据压缩
- Python - CGI 编程
- Python - XML 处理
- Python - 图形用户界面编程
- Python - 命令行参数
- Python - 文档字符串
- Python-JSON
- Python-发送电子邮件
- Python - 进一步扩展
- Python - 工具/实用程序
- Python - 图形用户界面
- Python 问题与解答
- Python - 编程示例
- Python - 快速指南
- Python - 有用的资源
- Python - 讨论
Python - 正则表达式
正则表达式是一种特殊的字符序列,可帮助您使用模式中保存的专用语法来匹配或查找其他字符串或字符串集。正则表达式也称为 regex,是定义搜索模式的字符序列。俗称正则表达式或正则表达式;它是指定文本中匹配模式的字符序列。通常,字符串搜索算法使用此类模式对字符串进行“查找”或“查找和替换”操作,或者用于输入验证。
数据科学项目中的大规模文本处理需要对文本数据进行操作。包括Python在内的许多编程语言都支持正则表达式处理。Python 的标准库有一个用于此目的的“re”模块。
由于 re 模块中定义的大多数函数都使用原始字符串,因此让我们首先了解原始字符串是什么。
原始字符串
正则表达式使用反斜杠字符 ('\') 来指示特殊形式或允许使用特殊字符而不调用其特殊含义。另一方面,Python 使用相同的字符作为转义字符。因此Python 使用原始字符串表示法。
如果字符串在引号之前带有 r 或 R 前缀,则该字符串成为原始字符串。因此 'Hello' 是一个普通字符串,而 r'Hello' 是一个原始字符串。
>>> normal="Hello" >>> print (normal) Hello >>> raw=r"Hello" >>> print (raw) Hello
正常情况下,两者没有区别。但是,当转义字符嵌入到字符串中时,普通字符串实际上会解释转义序列,而原始字符串不会处理转义字符。
>>> normal="Hello\nWorld" >>> print (normal) Hello World >>> raw=r"Hello\nWorld" >>> print (raw) Hello\nWorld
在上面的示例中,当打印普通字符串时,会处理转义字符“\n”以引入换行符。然而,由于原始字符串运算符“r”,转义字符的效果不会按照其含义进行翻译。
元字符
大多数字母和字符都会简单地匹配它们自己。但是,某些字符是特殊元字符,与自身不匹配。元字符是具有特殊含义的字符,类似于通配符中的*。
这是元字符的完整列表 -
. ^ $ * + ? { } [ ] \ | ( )
方括号符号[和]表示您希望匹配的一组字符。字符可以单独列出,也可以作为用“-”分隔的字符范围列出。
先生。 | 元字符和描述 |
---|---|
1 | [ABC] 匹配任意字符 a、b 或 c |
2 | [交流] 它使用范围来表示同一组字符。 |
3 | [阿兹] 仅匹配小写字母。 |
4 | [0-9] 仅匹配数字。 |
5 | '^' 补足[]中的字符集。[^5]将匹配除“5”之外的任何字符。 |
'\' 是转义元字符。当后面跟着各种字符时,它会形成各种特殊序列。如果需要匹配 [ 或 \,可以在它们前面加上反斜杠以删除其特殊含义:\[ 或 \\。
下面列出了由此类以 '\' 开头的特殊序列表示的预定义字符集 -
先生。 | 元字符和描述 |
---|---|
1 | \d 匹配任何十进制数字;这相当于类 [0-9]。 |
2 | \D 匹配任何非数字字符;这相当于类 [^0-9]。 |
3 | \s匹配任何空白字符;这相当于类 [\t\n\r\f\v]。 |
4 | \S 匹配任何非空白字符;这相当于类 [^\t\n\r\f\v]。 |
5 | \w 匹配任何字母数字字符;这相当于类 [a-zAZ0-9_]。 |
6 | \W 匹配任何非字母数字字符。相当于类 [^a-zAZ0-9_]。 |
7 | 。 与除换行符 '\n' 之外的任何单个字符匹配。 |
8 | ? 匹配左侧出现 0 或 1 次模式 |
9 | + 左侧出现 1 次或多次该模式 |
10 | * 左侧出现 0 次或多次该模式 |
11 | \b 单词和非单词之间的边界,/B 与 /b 相反 |
12 | [..] 匹配方括号中的任何单个字符,[^..] 匹配方括号之外的任何单个字符。 |
13 | \ 它用于特殊含义的字符,例如\。匹配句点或 \+ 表示加号。 |
14 | {n,m} 匹配前面至少出现 n 次且最多出现 m 次 |
15 | 一个| 乙 匹配 a 或 b |
Python 的 re 模块提供了有用的函数,用于查找匹配、搜索模式以及用其他字符串替换匹配的字符串等。
re.match() 函数
此函数尝试将字符串开头的RE模式与可选标志进行匹配。
这是该函数的语法-
re.match(pattern, string, flags=0)
这是参数的描述 -
先生。 | 参数及说明 |
---|---|
1 | 图案 这是要匹配的正则表达式。 |
2 | 细绳 这是字符串,将搜索该字符串以匹配字符串开头的模式。 |
3 | 旗帜 您可以使用按位或 (|) 指定不同的标志。这些是修饰符,如下表所列。 |
re.match函数在成功时返回一个匹配对象,在失败时返回None。匹配对象实例包含有关匹配的信息:开始和结束的位置、匹配的子字符串等。
匹配对象的start()方法返回模式在字符串中的起始位置,end()返回端点。
如果未找到模式,则匹配对象为 None。
我们使用匹配对象的group(num)或groups()函数来获取匹配的表达式。
先生。 | 匹配对象方法和描述 |
---|---|
1 | group(num=0)此方法返回整个匹配项(或特定子组编号) |
2 | groups()此方法返回元组中所有匹配的子组(如果没有则为空) |
例子
import re line = "Cats are smarter than dogs" matchObj = re.match( r'Cats', line) print (matchObj.start(), matchObj.end()) print ("matchObj.group() : ", matchObj.group())
它将产生以下输出-
0 4 matchObj.group() : Cats
re.search() 函数
该函数使用可选标志搜索字符串中第一次出现的 RE模式。
这是该函数的语法-
re.search(pattern, string, flags=0)
这是参数的描述 -
先生。 | 参数及说明 |
---|---|
1 | 图案 这是要匹配的正则表达式。 |
2 | 细绳 这是字符串,将搜索该字符串以匹配字符串中任意位置的模式。 |
3 | 旗帜 您可以使用按位或 (|) 指定不同的标志。这些是修饰符,如下表所列。 |
re.search函数在成功时返回一个匹配对象,在失败时返回任何内容。我们使用匹配对象的group(num)或groups()函数来获取匹配的表达式。
先生。 | 匹配对象方法和描述 |
---|---|
1 | group(num=0)此方法返回整个匹配项(或特定子组编号) |
2 | groups()此方法返回元组中所有匹配的子组(如果没有则为空) |
例子
import re line = "Cats are smarter than dogs" matchObj = re.search( r'than', line) print (matchObj.start(), matchObj.end()) print ("matchObj.group() : ", matchObj.group())
它将产生以下输出-
17 21 matchObj.group() : than
匹配与搜索
Python 提供了两种基于正则表达式的不同原语操作:match 仅在字符串开头检查匹配,而 search 检查字符串中任何位置的匹配(这是 Perl 默认情况下所做的)。
例子
import re line = "Cats are smarter than dogs"; matchObj = re.match( r'dogs', line, re.M|re.I) if matchObj: print ("match --> matchObj.group() : ", matchObj.group()) else: print ("No match!!") searchObj = re.search( r'dogs', line, re.M|re.I) if searchObj: print ("search --> searchObj.group() : ", searchObj.group()) else: print ("Nothing found!!")
执行上述代码时,会产生以下输出-
No match!! search --> matchObj.group() : dogs
re.findall() 函数
findall() 函数以字符串或元组列表的形式返回字符串中模式的所有非重叠匹配项。从左到右扫描字符串,并按找到的顺序返回匹配项。结果中包含空匹配项。
句法
re.findall(pattern, string, flags=0)
参数
先生。 | 参数及说明 |
---|---|
1 | 图案 这是要匹配的正则表达式。 |
2 | 细绳 这是字符串,将搜索该字符串以匹配字符串中任意位置的模式。 |
3 | 旗帜 您可以使用按位或 (|) 指定不同的标志。这些是修饰符,如下表所列。 |
例子
import re string="Simple is better than complex." obj=re.findall(r"ple", string) print (obj)
它将产生以下输出-
['ple', 'ple']
以下代码借助 findall() 函数获取句子中的单词列表。
import re string="Simple is better than complex." obj=re.findall(r"\w*", string) print (obj)
它将产生以下输出-
['Simple', '', 'is', '', 'better', '', 'than', '', 'complex', '', '']
re.sub() 函数
使用正则表达式的最重要的re方法之一是sub。
句法
re.sub(pattern, repl, string, max=0)
此方法将字符串中所有出现的 RE模式替换为repl,除非提供了max ,否则替换所有出现的情况。此方法返回修改后的字符串。
例子
import re phone = "2004-959-559 # This is Phone Number" # Delete Python-style comments num = re.sub(r'#.*$', "", phone) print ("Phone Num : ", num) # Remove anything other than digits num = re.sub(r'\D', "", phone) print ("Phone Num : ", num)
它将产生以下输出-
Phone Num : 2004-959-559 Phone Num : 2004959559
例子
以下示例使用 sub() 函数将所有出现的 is 替换为 was 单词 -
import re string="Simple is better than complex. Complex is better than complicated." obj=re.sub(r'is', r'was',string) print (obj)
它将产生以下输出-
Simple was better than complex. Complex was better than complicated.
re.compile() 函数
compile() 函数将正则表达式模式编译为正则表达式对象,可以使用其 match()、search() 等方法进行匹配。
句法
re.compile(pattern, flags=0)
旗帜
先生。 | 修改器和描述 |
---|---|
1 | 重新I 执行不区分大小写的匹配。 |
2 | 重新L 根据当前区域设置解释单词。此解释会影响字母组(\w 和 \W)以及单词边界Behave(\b 和 \B)。 |
3 | 关于。 M 使 $ 匹配行的结尾(不仅仅是字符串的结尾),并使 ^ 匹配任何行的开头(而不仅仅是字符串的开头)。 |
4 | 回复S 使句点(点)匹配任何字符,包括换行符。 |
5 | 重新U 根据 Unicode 字符集解释字母。该标志影响 \w、\W、\b、\B 的Behave。 |
6 | 重新X 允许“更可爱”的正则表达式语法。它忽略空格(除了在集合 [] 内或通过反斜杠转义时)并将未转义的 # 视为注释标记。 |
序列 -
prog = re.compile(pattern) result = prog.match(string)
相当于 -
result = re.match(pattern, string)
但是,当表达式在单个程序中多次使用时,使用 re.compile() 并保存生成的正则表达式对象以供重用会更有效。
例子
import re string="Simple is better than complex. Complex is better than complicated." pattern=re.compile(r'is') obj=pattern.match(string) obj=pattern.search(string) print (obj.start(), obj.end()) obj=pattern.findall(string) print (obj) obj=pattern.sub(r'was', string) print (obj)
它将产生以下输出 -
7 9 ['is', 'is'] Simple was better than complex. Complex was better than complicated.
re.finditer() 函数
此函数返回一个迭代器,生成字符串中 RE 模式的所有非重叠匹配的匹配对象。
句法
re.finditer(pattern, string, flags=0)
例子
import re string="Simple is better than complex. Complex is better than complicated." pattern=re.compile(r'is') iterator = pattern.finditer(string) print (iterator ) for match in iterator: print(match.span())
它将产生以下输出-
(7, 9) (39, 41)
Python 正则表达式的用例
查找所有副词
findall() 匹配模式的所有出现,而不是像 search() 那样只匹配第一个模式。例如,如果作者想要查找某些文本中的所有副词,他们可能会按以下方式使用 findall() -
import re text = "He was carefully disguised but captured quickly by police." obj = re.findall(r"\w+ly\b", text) print (obj)
它将产生以下输出-
['carefully', 'quickly']
查找以元音开头的单词
import re text = 'Errors should never pass silently. Unless explicitly silenced.' obj=re.findall(r'\b[aeiouAEIOU]\w+', text) print (obj)
它将产生以下输出-
['Errors', 'Unless', 'explicitly']