文章目录
正则表达式
正则表达式,又称为规则表达式(Regular Expression) , 是使用单个字符来描述,匹配某个句法规则的字符串, 常被用来检索,替换哪些符合某个模式(规则)的文本
简单来说, 正则表达式就是使用: 字符串定义规则, 并通过规则去验证字符串是否匹配
例如: 验证一个字符串是否符合电子邮箱地址的条件, 只需要配置好正则规则, 即可匹配任意邮箱, 不如通过正则规则: (^[\w-]+(\.[\w+]+)*@[\w+](.\[w-]+)+$) 即可匹配一个 字符串是否是标准邮箱格式
但是如果不使用正则, 使用 if else 来对字符串做判断就非常困难了
正则的三个基础方法
python正则表达式, 使用 re 模块, 并基于re模块中三个基础方法来做正则匹配, 分别是: match, search, findall三个基础方法
re.match(匹配规则, 配匹配的字符串)
从被匹配的字符串开头进行匹配, 匹配成功返回匹配对象(包含匹配的信息, 匹配不成功则返回空)
示例1:
python
import re
s = 'python hello python hello'
result = re.match('python', s)
print(result) # <re.Match object; span=(0, 6), match='python'>
print(result.span()) # (0, 6)
print(result.group()) # python
print(result.start()) # 0
print(result.end()) # 6
span()方法,如果匹配成功, 返回字符串所在下标
group()方法, 如果匹配成功,返回值注意: 如果匹配不成功, 调用上述两个方法会报错
实例2:
python
import re
s = '1pythoh hello, python, hello'
result = re.match('python', s)
print(result) # None
开头没有python,返回None
match()是从开头进行匹配, 如果开头不匹配, 后面就不再关心
serch(匹配规则, 被匹配字符串)
搜索整个字符串, 找出匹配的, 从前向后, 找到第一个后, 就停止, 不会继续向后
python
import re
s = '1python, hello, pythonhello'
result = re.search('python', s)
print(result) # <re.Match object; span=(1, 7), match='python'>
print(result.span()) # (1, 7)
print(result.group()) # python
findall(匹配规则, 被匹配字符串)
匹配整个字符串, 找出全部匹配项
python
import re
s = 'hello python, helloipython'
result = re.findall('python', s)
print(result) # ['python', 'python']
s = 'hello world'
result = re.findall('python', s)
print(result) # []
找不到返回空list: \[\]
元字符匹配
正则表达式最强大的功能在于元字符匹配规则
单字符匹配
| 字符 | 功能 |
|---|---|
| . | 匹配任意 1 个字符(除了 \n),\. 匹配点本身 |
| \[\] | 匹配 \[\] 中列举的字符 |
| \d | 匹配数字,即 0‑9 |
| \D | 匹配非数字 |
| \s | 匹配空白,即空格、tab 键 |
| \S | 匹配非空白 |
| \w | 匹配单词字符,即 a‑z、A‑Z、0‑9、_ |
| \W | 匹配非单词字符 |
python
import re
s = 'hello @@python!!66##item32cd'
# 找出全部数字
result1 = re.findall(r'\d', s)
print(result1) # ['6', '6', '3', '2']
# 找出特殊字符
result2 = re.findall(r'\W', s)
print(result2) # [' ', '@', '@', '!', '!', '#', '#'] `
找出全部英文字母
python
result3 = re.findall(r'[a-zA-Z]', s)
print(result3) # ['h', 'e', 'l', 'l', 'o', 'p', 'y', 't', 'h', 'o', 'n', 'i', 't', 'e', 'm', 'c', 'd']
[]内可以写a-zA-Z0-9这三中范围组成或指定单个字符如[aceDFG12]
python
result4 = re.findall(r'[acd123]', s)
print(result4) # ['3', '2', 'c', 'd']
数量匹配
| 字符 | 功能 |
|---|---|
* |
匹配前一个规则的字符出现 0 至无数次 |
+ |
匹配前一个规则的字符出现 1 至无数次 |
? |
匹配前一个规则的字符出现 0 次或 1 次 |
{m} |
匹配前一个规则的字符出现 m 次 |
{m,} |
匹配前一个规则的字符出现最少 m 次 |
{m,n} |
匹配前一个规则的字符出现 m 到 n 次 |
边界匹配
| 字符 | 功能 |
|---|---|
^ |
匹配字符串开头 |
$ |
匹配字符串结尾 |
\b |
匹配一个单词的边界 |
\B |
匹配非单词边界 |
分组匹配
| 字符 | 功能 |
|---|---|
| ` | ` |
() |
将括号中字符作为一个分组 |
示例:
python
import re
r = '^[0-9a-zA-Z]{6, 10}'
s = '1234567'
print(re.findall(r, s)) # []
上述代码打印结果是[], 这是为什么呢?
在匹配规则中, {6,10}中不可以写空格,会导致匹配出错