python基础语法学习: 正则表达式

文章目录

正则表达式

正则表达式,又称为规则表达式(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}中不可以写空格,会导致匹配出错

相关推荐
aiqianji16 分钟前
功能全面的教AI短篇小说写作的软件都有哪些?
人工智能·python
佳児素花痴╮25 分钟前
STM32U575RIT6(USART)学习
stm32·嵌入式硬件·学习
sunshine22 girl30 分钟前
Angular7,9,学习笔记三 dom操作
笔记·学习·angular
轮到我狗叫了35 分钟前
Slurm如何使用
人工智能·python·深度学习·机器学习
春风解人意1 小时前
从零开始学习嵌入式P28----线程
c语言·学习·算法
Ali885201 小时前
Python列表增删改查速查表和详细演示
python
新时代牛马1 小时前
softirq 与tasklet:从irq_exit 到__do_softirq 的下半部路径
python
tqs_123451 小时前
值传递与引用传递
java·开发语言·python
YsyaaabB1 小时前
Deep Agents 实战课程
python·langchain