6.正则表达式
(1)基础匹配
使用re模块
- match方法:
re.match(匹配规则,被匹配字符串)
从被匹配字符串开头进行匹配,成功则返回匹配对象包含的信息,失败则返回None。
python
s = "today is a beautiful day"
result = re.match("today", s)
print(result)
"""
输出:
<re.Match object; span=(0, 5), match='today'>
"""
s = "today is a beautiful day"
result = re.match("day", s)
print(result)
"""
输出:
None
"""
- search方法:
re.search(匹配规则,被匹配字符串)
从前向后搜索整个字符串,找到第一个匹配的字符串后停止。成功则返回匹配对象包含的信息,失败则返回None。
python
b = "Happy Mid-Autumn Festival,tumn"
result2 = re.search("tumn", b)
print(result2)
"""
输出:
<re.Match object; span=(12, 16), match='tumn'>
"""
- findall方法:
re.findall(匹配规则,被匹配字符串)
搜索匹配整个字符串,找出全部匹配项,找不到则返回空list[]
python
b = "Happy Mid-Autumn Festival, tumn"
result2 = re.search("tumn", b)
print(result2)
result3 = re.findall("tumn", b)
print(result3)
"""
输出:
<re.Match object; span=(12, 16), match='tumn'>
['tumn', 'tumn']
"""
(2) 元字符匹配
【在正则中,代码不需要Python规范格式的空格】
代码 | 功能 |
---|---|
单字符匹配 | |
. | 匹配任意1个字符,除了\n、.匹配点本身 |
[] | 匹配[]中例举的字符 |
\d | 匹配数字0-9 |
\D | 匹配非数字 |
\s | 匹配空白、空格、tab键 |
\S | 匹配非空白 |
\w | 匹配单词字符,a-z、A-Z、0-9,_ |
\W | 匹配非单词字符 |
数量匹配 | |
* | 匹配前一个规则的字符出现0到无数次 |
+ | 匹配前一个规则的字符出现1到无数次 |
? | 匹配前一个规则的字符出现0或1次 |
{m} | 匹配前一个规则的字符出现m次 |
{m,} | 匹配前一个规则的字符最少出现m次 |
{m,n} | 匹配前一个规则的字符出现m到n次 |
边界匹配 | |
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
\b | 匹配一个单词的边界 |
\B | 匹配非单词边界 |
分组匹配 | |
| | 匹配左右任意一个表达式 |
() | 将括号中字符作为一个分组 |
python
a = "20240917.@qq.com!!!"
# r标记表示字符串中转义字符无效,为普通字符
result4 = re.findall(r'\W', a)
result5 = re.findall(r'[a-zA-Z]', a)
result6 = re.findall(r'[abcdqq]', a)
print(result4)
print(result5)
print(result6)
"""
输出:
['.', '@', '.', '!', '!', '!']
['q', 'q', 'c', 'o', 'm']
['q', 'q', 'c']
"""
# 匹配账号,只能由字母和数字组成,长度限制6到10位
r = '^0-9a-zA-Z{6,10}$'
s = '25778&'
print(re.findall(r, s))
# 匹配QQ号,纯数字,长度5-11位,第一位不为0
m = '^[1-9][0-9]{4,10}$'
n = '012345855'
print(re.findall(m, n))
# 匹配邮箱地址,只允许qq、163、gmail三种类型邮箱
q = '(^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+$)'
# 对于findall方法判断正则表达式时,如果有()分组,则会将每个分组的结果列出,可以使用()将整个表达式作为一组
# abc.qwe.asd@qq.com
【记录学习心得的笔记,欢迎大家一起讨论,会持续更新】