正则表达式
1.re的使用过程
# 导入re模块
import re
# 使用match方法进行匹配操作
result = re.match(正则表达式,要匹配的字符串)
# 如果上一步匹配到倒数,可以用group方法来提取数据
result.group()
2.re模块示例
import re
result = re.match("bupt", "bupt.edu.cn")
result.group()
结果为:
bupt
匹配单个字符
字符 | 功能 |
---|---|
. | 匹配任意一个字符(除了\n) |
[] | 匹配[]中列举的字符 |
\d | 匹配数字0-9 |
\D | 匹配非数字 |
\s | 匹配空白,包括空格和tab键 |
\S | 匹配非空白 |
\w | 匹配单词字符,即a-z,A-Z,0-9,_ |
\W | 匹配非单词字符 |
import re
ret1 = re.match(r".", "Eamon_稳")
print(ret1.group())
ret2 = re.match(r"[稳a]", "a稳")
print(ret2.group())
ret3 = re.match(r"\w", "_Eamon稳")
print(ret3.group())
运行结果:
E
a
_
匹配多个字符
字符 | 功能 |
---|---|
* | 匹配前一个字符出现0或者n次,可有可无 |
+ | 匹配前一个字符出现1次或者无限次,至少1次 |
? | 匹配前一个字符0或者1次 |
{m} | 匹配前一个字符出现m次 |
{m,n} | 匹配前一个字符出现从m到n次 |
这里和匹配单个字符组合使用:
import re
ret1 = re.match(r".*", "Eamon_稳")
print(ret1.group())
ret2 = re.match(r"[a-zA-Z0-9]+", "Ae86")
print(ret2.group())
ret3 = re.match(r"_?\w*", "_全部匹配")
print(ret3.group())
运行结果:
Eamon_稳
Ae86
_Eamon全部匹配
可以自由多种组合搭配
匹配开头结尾
字符 | 功能 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
匹配分组
字符 | 功能 |
---|---|
| | 匹配左右任意一个表达式 |
(ab) | 将括号中字符作为一个分组 |
\num | 引用分组num匹配到的字符串 |
(?P) | 分组起别名 |
(?P=name) | 引用别名为name分组匹配到的字符串 |
eg:当匹配邮箱的时候,可能有163邮箱和126邮箱或qq邮箱,这时候三个都可以匹配:r"\w{4,20}@163|126|qq.com"。为确保没有歧义理解成r"\w{4,20}@163和126|qq.com两部分。因此需要加上括号进行分组,以确定范围:r"\w{4,20}@(163|126|qq).com"
import re
ret = re.match(r"\w{4,20}@(163|126|qq)\.com", "[email protected]")
print(ret.group())
print(ret.group(1))
运行结果:
[email protected]
qq
group()括号里加数字代表匹配中的第几个分组,示例中只有一个括号,因此是1。同理可以加多个括号,并且按序取出group(n)的值。
import re
label = "<body><h1>哈哈这是前端的标签</h1></body>"
ret = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", label)
print(ret.group())
print(ret.group(2))
运行结果:
<body><h1>哈哈这是前端的标签</h1></body>
h1
示例中的数字1,2分别代表分组出现的顺序。当分组过多的时候,可以用名字进行替代(?P),引用的时候(?P=name)。
search
re.search函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None。
import re
ret = re.search(r"\d+", "阅读次数为 9999")
ret.group()
运行结果:
'9999'
match()和search()的区别:
match()函数只检测RE是不是在string的开始位置匹配,search()会扫描整个string查找匹配;
也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回none。
如:print(re.match(‘super’, ‘superstition’).span()) 会返回(0, 5)
print(re.match(‘super’, ‘insuperable’)) 则返回None
如:print(re.search(‘super’, ‘superstition’).span())返回(0, 5)
print(re.search(‘super’, ‘insuperable’).span())返回(2, 7)
findall
re.findall遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表。
import re
ret = re.findall(r"d+","python=90, java=95, linux=88")
print(ret)
运行结果:
['90', '95', '88']
sub
使用re替换string中每一个匹配的子串后返回替换后的字符串。
import re
ret = re.sub(r"\d+", "100", "bupt=95")
print(ret)
运行结果:
bupt=100
sub支持函数调用
import re
def add(num):
strNum = num.group()
num = int(strNum) + 1
return str(num)
ret = re.sub(r"\d+", add, "bupt=95")
print(ret)
运行结果
bupt=96
split
根据匹配进行切割字符串,并返回一个列表
import re
ret = re.split(r":| ", "info:Eamon bj bupt")
print(ret)
运行结果:
['info', 'Eamon', 'bj', 'bupt']