秀!这应该是最好的 “re正则表达式” 使用教程了
阅读本文大概需要 3 分钟。
1. 什么是“正则表达式”
2. 常用“操作符”介绍
① 7 个普通元字符
② 4 个常用量化符
③ 6 个特殊符号
④ 3 个常用修饰符
3. 常用方法介绍
-
match():匹配字符串的开头,如果开头匹配不上,则返回 None; -
search():扫描整个字符串,匹配后立即返回,不在往后面匹配; -
findall():扫描整个字符串,以列表形式返回所有的匹配值; -
compile():将字符串编译成正则表达式对象,供 match() 、 search() 和findall() 函数使用; -
sub():扫描整个字符串,用于替换字符串的某些值; -
split():扫描整个字符串,按照指定分隔符切分字符串;
① match(pattern,string,flag)
-
pattern:你写的正则表达式; -
string:待匹配的字符串; -
flag:修饰符;
s1 = 'ab黄cd同abc学'
re.match('a',s1)
s1 = 'ab黄cd同abc学'
r1 = re.match('a',s1)
r1.group()
s1 = 'ab黄cd同abc学'
r2 = re.match('b',s1)
r2.group()
② search(pattern, string,flag)
-
pattern:你写的正则表达式; -
string:待匹配的字符串; -
flag:修饰符;
s1 = 'ab黄cd同abc学'
s1 = 'ab黄cd同abc学'
r2 = re.search('a',s1)
r2.group()
s1 = 'ab黄cd同abc学'
r2 = re.search('b',s1)
r2.group()
③ findall(pattern, repl, string, count=0, flags=0)
-
pattern:你写的正则表达式; -
string:待匹配的字符串; -
flag:修饰符;
s1 = 'ab黄cd同abc学'
re.findall('a',s1)
re.findall('b',s1)
re.findall('[a | b]',s1)
s1 = 'ab黄cd同abc学'
re.findall('f',s1)
html = '''<html>
<head lang="en">
<title>Title</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<div id="content">
<ul id="ul1">
<li>first</li>
<li>second</li>
<li>third</li>
</ul>
<ul id="ul2">
<li>alpha</li>
<li>beta</li>
</ul>
</div>
<div id="url">
<a href="http:www.baidu.com" title="baidu">baidu</a>
<a href="http:www.tipdm.com" title="tipdm">tipdm</a>
</div>
</body>
</html>
'''
# 获取li标签
re.findall('<li>(.*?)</li>',html)
# 获取href属性
re.findall('<a href="(.*?)" ',html)
-
. 可以匹配除了换行符以外的所有字符; -
* 表示匹配前面的字符无限次; -
? 前面紧挨的元素,最多匹配一次;
s2 = 'a123b456b789b3'
re.findall('a(.*)3',s2)
re.findall('a(.*?)3',s2)
④ compile()
type(re.compile(r'd+'))
s3 = '12one34two56three78four'
# 定义一个正则表达式对象,用于匹配至少一个数字
pattern = re.compile(r'd+')
# 扫描整个字符串,匹配s3字符串中,符合该正则表达式的字符串。(这里调用的是对象的findll()对象)。
pattern.findall(s3)
# 从s3字符串,下标为1的位置,查找匹配值。
pattern.findall(s3,1)
# 从s3字符串,下标为1到下标为6的位置之间,查找匹配值。
pattern.findall(s3,1,6)
⑤ sub(pattern, repl, string, count, flags)
-
pattern:你写的正则表达式; -
repl:替换成啥; -
string:待替换的字符串; -
count:表示最大替换次数,默认 0 表示替换所有的匹配; -
flag:修饰符;
# 'D{3,5}'表示匹配非数字3-5次。
s3 = '12one34two56three78four'
# 这里没有指定最大匹配次数,因此默认会替换所有的匹配值
re.sub('D{3,5}','字母',s3)
# 这里指定最大匹配次数count=2,因此只会替换前2个匹配值
re.sub('D{3,5}','字母',s3,2)
# 如果count=3,则会替换3个匹配值
re.sub('D{3,5}','字母',s3,3)
⑥ split(pattern, string, maxsplit, flags)
-
pattern:你写的正则表达式; -
string:待分割的字符串; -
maxsplit:最大分割次数,默认为 0,表示不限制分割次数; -
flag:修饰符;
# 'D'表示匹配非数字
s4 = '136-3456-7413'
# 这里如果不指定“最大分割次数”,则是不限次数切分
re.split('D',s4)
# 如果指定最大分割次数maxsplit=1,那么就只以第一个分隔符,进行切分
re.split('D',s4,1)
End
「进击的Coder」专属学习群已正式成立,搜索「CQCcqc4」添加崔庆才的个人微信或者扫描下方二维码拉您入群交流学习。
赶紧动手试一试
原文始发于微信公众号(进击的Coder):秀!这应该是最好的 “re正则表达式” 使用教程了
THE END
0
二维码
海报
秀!这应该是最好的 “re正则表达式” 使用教程了
这是「进击的Coder」的第 379 篇技术分享
作者:黄伟呢
来源:数据分析与统计学之美
“
阅读本文大概需要 3 分钟。
”
其实写正则表达式的人,……
![](https://kz.cx/wp-content/uploads/2021/10/Pasted-11.png)