Python-正则表达式(re 模块)_python re
目录
- 一、re 模块的使用过程
- 二、正则表达式的字符匹配
-
- 1. 匹配开头结尾
- 2. 匹配单个字符
- 3. 匹配多个字符
- 4. 匹配分组
- 5. Python 代码示例
- 三、re 模块的函数
-
- 1. 函数一览表
- 2. Python 代码示例
-
- 1)search 与 finditer
- 2)findall
- 3)sub
- 4)split
- 四、贪婪与非贪婪
- 五、re 模块的可选标志
参考文章:
【re — 正则表达式操作】
【正则表达式指南】
【Python 正则表达式 | 菜鸟教程】
【Python 正则表达式 | 极客教程】
【Python正则表达式详解 (超详细,看完必会!)】
一、re 模块的使用过程
# 导入 re 模块import re# 使用 match 方法进行匹配操作# re.match() 能够匹配出以 xxx 开头的字符串result = re.match(r\'正则表达式\', \'被匹配的字符串\')if result:# 如果上一步匹配到数据的话,可以使用 group 方法来提取数据print(result.group())else:print(\'匹配失败\')
需要注意的是:
Python 中字符串前面加上 r 表示原生字符串。与大多数编程语言相同,正则表达式里使用 “\\” 作为转义字符,这就可能造成反斜杠困扰。Python 里的原生字符串很好地解决了这个问题,同时写出来的表达式也更直观。注意 r 只服务于 “\\” ,不对其他进行转义。
二、正则表达式的字符匹配
1. 匹配开头结尾
^
$
2. 匹配单个字符
.
\\n
[]
[^]
\\d
[0-9]
\\D
[^0-9]
\\s
[\\t\\n\\r\\f\\v]
\\S
[^\\t\\n\\r\\f\\v]
\\w
[a-zA-Z0-9_]
\\W
[^a-zA-Z0-9_]
\\b
\\B
\\A
\\Z
-
\\ 是转义特殊字符,\\n 代表换行、\\r 代表回车、\\f 代表换页、\\t 代表 Tab 键
-
通过用 ‘-’ 将两个字符连起来可以表示字符范围,比如:
- [a-z] 将匹配任何小写 ASCII 字符, [0-5][0-9] 将匹配从 00 到 59 的两位数字,[0-9A-Fa-f] 将匹配任何十六进制数位。
- 如果 - 进行了转义 (比如 [a\\-z])或者它的位置在首位或末尾(如 [-a] 或 [a-]),那么它就只表示普通字符 ‘-’
-
除反斜杠外的特殊字符在 [ ] 中会失去其特殊含义,例如:[(+*)] 将匹配字符为 ( + * 或 ) 中的任何一个
3. 匹配多个字符
*
+
?
{m}
{m,n}
{m,}
-
ab* 会匹配 ‘a’,‘ab’,或者 ‘a’ 后面跟随任意个 ‘b’
-
ab+ 会匹配 ‘a’ 后面跟随 1 个以上到任意个 ‘b’,它不会匹配 ‘a’
-
ab? 会匹配 ‘a’ 或者 ‘ab’
-
a{6} 将匹配 6 个 ‘a’ , 少于 6 个的话就会导致匹配失败
-
a{3,5} 将匹配 3 到 5 个 ‘a’
4. 匹配分组
()
\\num
(?P)
(?P=name)
5. Python 代码示例
- 匹配出 126、163、qq 的邮箱地址,且 @ 符号之前有 4 到 20 位数字、大写或小写字母和下划线的组合。
import reemail_list = [\"Alice27@163.com\", \"Sam_1122@gmail.com\", \".Tom_12@qq.com\", \"Bob_1988@qq.com.com\", \"Elowen@126.com\", \"Ice@qq.com\", \"nicetomeetyou@qq.com\"]for email in email_list: ret = re.match(r\"\\w{4,20}@(163|126|qq)\\.com$\", email) if ret: print(\"%s 是符合规定的邮件地址 , 匹配后的结果是 : %s\" % (email, ret.group())) else: print(\"%s 不符合要求\" % email)
结果展示:
Alice27@163.com 是符合规定的邮件地址 , 匹配后的结果是 : Alice27@163.comSam_1122@gmail.com 不符合要求.Tom_12@qq.com 不符合要求Bob_1988@qq.com.com 不符合要求Elowen@126.com 是符合规定的邮件地址 , 匹配后的结果是 : Elowen@126.comIce@qq.com 不符合要求nicetomeetyou@qq.com 是符合规定的邮件地址 , 匹配后的结果是 : nicetomeetyou@qq.com
-
匹配 11 位不是以 4、7 结尾的手机号码:
re.match(r\"1\\d{9}[0-35-68-9]$\", tel)
-
提取区号和电话号码:
ret = re.match(r\"([^-]+)-(\\d+)\",\"010-12345678\")
,此时 ret.group(1) = ‘010’ ,ret.group(2) = ‘12345678’ ,ret.group(0) 等价于 ret.group() 等于 ‘010-12345678’ -
匹配标签,例如:匹配
hello
并提取出 hello
import retexts = [\'hello
\', \'world
\', \'hello\'
]def match(): for text in texts: ret = re.match(r\'(\\w*)\', text) if ret: print(f\'匹配成功,标签为 {ret.group()},信息为 {ret.group(3)}\') else: print(f\'{text} 标签匹配失败\')if __name__ == \'__main__\': match()
结果展示:
匹配成功,标签为 hello
,信息为 helloworld
标签匹配失败hello 标签匹配失败
- 用 (?P) 和 (?P=name) 改进上述示例:
re.match(r\'<(?P[a-zA-Z]*)><(?P[a-zA-Z0-9]*)>(\\w*)\', text)
注意:字母 P 要大写
三、re 模块的函数
1. 函数一览表
re.compile(pattern, flags=0)
re.search(pattern, string, flags=0)
re.match(pattern, string, flags=0)
re.fullmatch(pattern, string, flags=0)
re.split(pattern, string, maxsplit=0, flags=0)
re.findall(pattern, string, flags=0)
re.finditer(pattern, string, flags=0)
re.sub(pattern, repl, string, count=0, flags=0)
re.subn(pattern, repl, string, count=0, flags=0)
re.escape(pattern)
re.purge()
-
result = re.match(pattern, string)
等价于prog = re.compile(pattern)
和result = prog.match(string)
。 -
re.split
函数中如果 maxsplit 非零,则最多进行 maxsplit 次分隔,剩下的字符全部返回到列表的最后一个元素。
2. Python 代码示例
1)search 与 finditer
需求:匹配出文章阅读的次数和点赞的次数。
import redef find_second_match(pattern, text): matches = re.finditer(pattern, text) try: next(matches) # 跳过第一个匹配项 second_match = next(matches) # 获取第二个匹配项 return second_match.group() except StopIteration: return Noneif __name__ == \'__main__\': p = r\"\\d+\" t = \"阅读次数为 9999 , 点赞次数为 19999\" ret = re.search(p, t) print(f\'阅读次数为 {ret.group()} , 点赞次数为 {find_second_match(p, t)}\')
结果展示:
阅读次数为 9999 , 点赞次数为 19999
2)findall
- 需求:统计出相应文章阅读、点赞和收藏的次数。
import reret = re.findall(r\"\\d+\", \"read = 9999, thumbs up = 7890, collection = 12345\")print(f\'阅读次数 {ret[0]} ,点赞次数 {ret[1]} ,收藏次数 {ret[2]}\')
结果展示:
阅读次数 9999 ,点赞次数 7890 ,收藏次数 12345
【拓展】:分组()
内加入 ?:
可以避免只返回分组内的内容。
- 需求:提取出字符串里的日期和时间 。
import reif __name__ == \'__main__\': s = \'hello world, now is 2020/7/20 18:48, 现在是 2020年7月20日18时48分。\' ret_s = re.sub(r\'年|月\', r\'/\', s) ret_s = re.sub(r\'日|分\', r\' \', ret_s) ret_s = re.sub(r\'时\', r\':\', ret_s) # hello world, now is 2020/7/20 18:48, 现在是 2020/7/20 18:48 。 print(ret_s) # findall com1 = re.compile(r\'\\d{4}/[01]?[0-9]/[1-3]?[0-9]\\s(0[0-9]|1[0-9]|2[0-4])\\:[0-5][0-9]\') ret1 = com1.findall(ret_s) print(ret1[0]) # 18 # 加 ?: com2 = re.compile(r\'\\d{4}/[01]?[0-9]/[1-3]?[0-9]\\s(?:0[0-9]|1[0-9]|2[0-4])\\:[0-5][0-9]\') ret2 = com2.findall(ret_s) print(ret2[0]) # 2020/7/20 18:48 # search ret3 = re.search(r\'\\d{4}/[01]?[0-9]/[1-3]?[0-9]\\s(0[0-9]|1[0-9]|2[0-4])\\:[0-5][0-9]\', ret_s) print(ret3.group()) # 2020/7/20 18:48
3)sub
将匹配到的数据进行替换。
- 需求:将匹配到的阅读次数加 1 。
import redef add(temp): str_num = temp.group() num = int(str_num) + 1 return str(num)if __name__ == \'__main__\': ret = re.sub(r\"\\d+\", \'998\', \"thumbs up = 997\") print(ret) ret = re.sub(r\"\\d+\", add, \"thumbs up = 997\") print(ret) ret = re.sub(r\"\\d+\", lambda x: str(int(x.group()) + 1), \"thumbs up = 997\") print(ret) print(\'-\' * 30) # count 替换次数 text = \"apple apple apple apple\" pattern = r\"apple\" replacement = \"orange\" new_text = re.sub(pattern, replacement, text, count=2) print(new_text)
结果展示:
thumbs up = 998thumbs up = 998thumbs up = 998------------------------------orange orange apple apple
- 需求:删除字符串中所有的 HTML 标签和
import reif __name__ == \'__main__\': text = (\'\' + \'\\n\' + \'岗位职责:
\' + \'\\n\' + \'完成推荐算法、数据统计、接口、后台等服务器端相关工作
\' + \'\\n\' + \'
\' + \'\\n\' + \'必备要求:
\' + \'\\n\' + \'良好的自我驱动力和职业素养,工作积极主动、结果导向
\' + \'\\n\' + \'
\' + \'\\n\' + \'技术要求:
\' + \'\\n\' + \'1、一年以上 Python 开发经验,掌握面向对象分析和设计,了解设计模式
\' + \'\\n\' + \'2、掌握 HTTP 协议,熟悉 MVC、MVVM 等概念以及相关 WEB 开发框架
\' + \'\\n\' + \'3、掌握关系数据库开发设计,掌握 SQL,熟练使用 MySQL/PostgreSQL 中的一种
\' + \'\\n\' + \'4、掌握 NoSQL、MQ,熟练使用对应技术解决方案
\' + \'\\n\' + \'5、熟悉 Javascript/CSS/HTML5,JQuery、React、Vue.js
\' + \'\\n\' + \'
\' + \'\\n\' + \'加分项:
\' + \'\\n\' + \'大数据,数理统计,机器学习,sklearn,高性能,大并发。
\' + \'\\n\' + \'\') # print(text) sub_result = re.sub(r\"]*>| \", \"\", text) print(sub_result)
结果展示:
岗位职责:完成推荐算法、数据统计、接口、后台等服务器端相关工作必备要求:良好的自我驱动力和职业素养,工作积极主动、结果导向技术要求:1、一年以上 Python 开发经验,掌握面向对象分析和设计,了解设计模式2、掌握 HTTP 协议,熟悉 MVC、MVVM 等概念以及相关 WEB 开发框架3、掌握关系数据库开发设计,掌握 SQL,熟练使用 MySQL/PostgreSQL 中的一种4、掌握 NoSQL、MQ,熟练使用对应技术解决方案5、熟悉 Javascript/CSS/HTML5,JQuery、React、Vue.js加分项:大数据,数理统计,机器学习,sklearn,高性能,大并发。
解析正则表达式:r\"]*>| \"
-
]*>
:匹配一对尖括号 及其内部内容,且内容不包含 > 符号,表示匹配 HTML 标签,比如