这篇教程Python 正则模块详情写得很实用,希望能帮到您。 在Python 中提供了操作正则表达式的模块,即re 模块。
1、正则表达式的装饰符 修饰符 | 描述 | 完整名称 | re.I | 使匹配对大小写不敏感 | re.IGNORECASE | re.A | 让 /w, /W, /b, /B, /d, /D, /s 和 /S 只匹配ASCII,而不是Unicode | re.ASCII | re.L | 做本地化识别(locale-aware)匹配 | re.LOCALE | re.M | 多行匹配,影响 ^ 和 $,多行模式下是支持匹配行开头 | re.MULTILINE | re.S | 使 . 匹配包括换行在内的所有字符 | e.DOTALL | re.U | 根据Unicode字符集解析字符。这个标志影响 /w, /W, /b, /B. | re.UNICODE | re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |
2、查找单个匹配项2.1 matchre.match 如果 string 开始的0或者多个字符匹配到了正则表达式样式,就返回一个相应的匹配对象 。 如果没有匹配,就返回 None ;注意它跟零长度匹配是不同的。
语法格式: re.match(pattern, string, flags=0)
pattern :匹配的正则表达式 string :要匹配的字符串。 flags :标志位,用于控制正则表达式的匹配方式, 如:是否区分大小写,多行匹配等等。
匹配成功re.match 方法返回一个匹配的对象,否则返回None。 示例代码: """-*- coding:uft-8 -*-author: 小甜time:2020/5/30"""import restring1 = "hello python"string2 = "hell5o python"pattern = r"[a-z]+/s/w+" # a-z出现1次到任意次加一个/s加任意字符出现1次到任意次print(re.match(pattern, string1)) # <re.Match object; span=(0, 12), match='hello python'>print(re.match(pattern, string2)) # None 开局导入re 模块,r ""表示为一个正则表达式
因为string2 中间出现了一个数字5 所以不匹配
2.2 groupre.group 是从Match 对象中获取结果的,不过不分组默认为0,分组索引则从0开始(0是完整的一个匹配),如果多个分组,则第一个分组是1;也可以为其命名使用
示例代码: """-*- coding:uft-8 -*-author: 小甜time:2020/5/30"""import restring1 = "hello python"string2 = "hell5o python"pattern = r"[a-z]+/s/w+"pattern1 = r"(/w+)(/s)(/w+)"pattern2 = r"(?P<first>/w+/s)(?P<last>/w+)" # 命名分组print(re.match(pattern, string1)) # <re.Match object; span=(0, 12), match='hello python'>print(re.match(pattern, string1).group()) # hello pythonprint(re.match(pattern, string2)) # Noneprint(re.match(pattern1, string2).group(0)) # hell5o pythonprint(re.match(pattern1, string2).group(1)) # hell5oprint(re.match(pattern1, string2).group(2)) # 这里匹配的是那个空格print(re.match(pattern1, string2).group(3)) # pythonprint(re.match(pattern2, string2).group("last")) # python
2.3 searchre.search 扫描整个字符串找到匹配样式的第一个位置,并返回一个相应的匹配对象 。如果没有匹配,就返回一个 None ; 注意这和找到一个零长度匹配是不同的。语法结构和match 是一样的
示例代码: """-*- coding:uft-8 -*-author: 小甜time:2020/5/30"""import restring = "Hi World Hello python"pattern = r"Hello python"print(re.search(pattern, string).group()) # Hello pythonprint(re.match(pattern, string)) # None 两者的区别: re.match 只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回 None ,而 re.search 匹配整个字符串,直到找到一个匹配。
2.4 fullmatchre.fullmatch 如果整个 string 匹配这个正则表达式,就返回一个相应的匹配对象 。 否则就返回 None ; 注意跟零长度匹配是不同的。
语法格式跟上面的也是一样的 示例代码: """-*- coding:uft-8 -*-author: 小甜time:2020/5/30"""import restring = "Hi World Hello python"pattern = r"Hi World Hello python"pattern1 = r"hi World hello python"print(re.fullmatch(pattern, string)) # <re.Match object; span=(0, 21), match='Hi World Hello python'>print(re.fullmatch(pattern1, string)) # None 三者的区别: match :字符串开头匹配 search :查找任意位置的匹配项 fullmatch :整个字符串要与正则表达式完全匹配
2.5 匹配对象匹配对象总是有一个布尔值 True 。如果没有匹配的话match() 和 search() 返回 None 所以可以简单的用 if 语句来判断是否匹配 示例代码: import restring = "Hi World Hello python"pattern = r"Hello python"match1 = re.search(pattern, string)match2 = re.match(pattern, string)if match1: print(match1.group()) # Hello pythonif match2: # 因为match2的值为none所以不执行 print(match2.group())
3、查找多个匹配项
3.1 compilere.compile 将正则表达式的样式编译为一个正则对象,可以用于匹配
语法结构: re.compile(pattern, flags=0)
pattern : 匹配的正则表达式 flags : 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
3.2 findallre.findall 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。与match 和 search 不同的是 match 和 search 是匹配一次 findall 匹配所有。
语法结构: re.findall(string[, pos[, endpos]])
string :待匹配的字符串。 pos :可选参数,指定字符串的起始位置,默认为 0。 endpos :可选参数,指定字符串的结束位置,默认为字符串的长度
3.3 finditerpattern 在 string 里所有的非重复匹配,返回为一个迭代器保存了匹配对象 。 *string *从左到右扫描,匹配按顺序排列。空匹配也包含在结果里。
语法结构同match 示例代码: import refrom collections.abc import Iterator # 导入判断是否为迭代器的对象string = "hello python hi javascript"pattern = r"/b/w+/b"pattern_object = re.compile(r"/b/w+/b")print(type(pattern_object)) # <class 're.Pattern'>findall = pattern_object.findall(string)for i in findall: print(i)finditer = re.finditer(pattern, string)# 判断是否为迭代器print(isinstance(finditer, Iterator)) # Truefor _ in range(4): finditer1 = finditer.__next__() # 取出下一个值 print(finditer1.group())'''--循环结果--hellopythonhijavascript''' 如果有超大量的匹配项的话,返回finditer 的性能要优于findall ,这就是列表和迭代器的区别。
4、分割splitre.split 方法按照能够匹配的子串将字符串分割后返回列表
语法结构: re.split(pattern, string[, maxsplit=0, flags=0])
pattern :匹配的正则表达式 string :分隔符。 maxsplit :分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。 flags :标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。 示例代码: import restring = '''hello hi good morninggoodnightpythonjavascriptLinux'''pattern = r'/s+' # 以空格回车制表符为回车符print(re.split(pattern, string)) # 不限制次数分隔# ['hello', 'hi', 'good', 'morning', 'goodnight', 'python', 'javascript', 'Linux', '']print(re.split(pattern, string, 5)) # 分隔5次# ['hello', 'hi', 'good', 'morning', 'goodnight', 'python/njavascript/nLinux/n'] 与str 模块的split 不同的是,re 模块的split 支持正则
4.1 替换
4.1.1 subre.sub 用于替换字符串中的匹配项
语法结构: re.sub(pattern, repl, string, count=0, flags=0)
pattern : 正则中的模式字符串。 repl : 替换的字符串,也可为一个函数。 string : 要被查找替换的原始字符串。 count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。 flags : 编译时用的匹配模式,数字形式。 到这里就可以完成一个某手的评论区,修改不良评论的小案例 import restring = input("请输入评论:")pattern = r"[美丽可爱大方]{1}" # 检测的字符print(re.sub(pattern, "萌", string)) 效果图: 

4.1.2 subn行为与 sub() 相同,但是返回一个元组 (字符串, 替换次数).
4.2 escapere.escape(pattern) 转义 pattern 中的特殊字符。例如正则里面的元字符.
示例代码: import repattern = r'/w/s*/d/d.'# 打印pattern的特殊字符print(re.escape(pattern)) # /w/s*/d/d. 任意可能包含正则表达式元字符的文本字符串进行匹配,它就是有用的,不过容易出现错误,手动转义比较好
4.3 purgere.purge() 清除正则表达式的缓存。
到此这篇关于Python 正则模块详情的文章就介绍到这了,更多相关Python 正则模块内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net! Python 数据可视化之Bokeh详解 Qt自定义Plot实现曲线绘制的详细过程 |