Chapter 41 正则表达式

时间:2025-03-31 07:42:09

欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能!

文章目录

  • 前言
  • 一、基础匹配
  • 二、元字符匹配


前言

在文本处理、数据清洗、格式验证等众多场景中,正则表达式为我们提供了一种便捷而高效的方法。本文详细讲解了正则表达式基础匹配以及元字符匹配的基本用法和应用场景。


本篇文章参考:黑马程序员

一、基础匹配

正则表达式,又称为规则表达式,是一种通过单个字符串来描述和匹配特定模式的工具。它常用于检索和替换符合某种规则的文本。例如,要验证一个字符串是否符合电子邮箱地址的格式,只需使用适当的正则规则即可匹配任意邮箱地址。如果不用正则表达式,仅通过 if…else 语句来处理字符串,代码往往会变得冗长且难以维护。因此,正则表达式是简化这一过程的有效工具。

在Python中,我们使用re模块来操作正则表达式,以下为re模块中的三个基本方法:
①match方法
(匹配规则,被匹配字符串)
()方法:从字符串的开头开始匹配。如果开头符合规定的正则表达式,返回一个匹配对象;否则返回None。该方法适用于需要在字符串首部检验格式的情境。
【注意】
对象的字符串表示形式通常为 < object; span=(start, end), match='matched_string'> ,包含了匹配的相关信息。

  • object:表示这是一个正则表达式匹配对象。
  • span=(start, end):表示匹配的字符串在原始字符串中的起始和结束位置。start 是匹配的开始索引, end 是匹配的结束索引 (不包含)
  • match=‘matched_string’:表示实际匹配到的字符串内容。
# 导包
import re
# match()方法:从头开始匹配,匹配第一个命中项
s1="python 2python 3python"
s2="1python 2python python"
result1=re.match("python",s1)
result2=re.match("python",s2)
print(result1)
print(result2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

输出结果:
< object; span=(0, 6),match=‘python’>
None

可以使用span()group()方法获取匹配的相关信息。
span()方法:表示匹配的起始和结束位置,返回一个元组。
group()方法:返回实际匹配的字符串。

# 导包
import re
# match()方法:从头开始匹配,匹配第一个命中项
s1="python 2python 3python"
result1=re.match("python",s1)
# 获取匹配对象的信息 
print(result1.span())
print(result1.group())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

输出结果:
(0, 6)
python

②search方法
(匹配规则,被匹配字符串)
()方法:在整个字符串中查找第一个符合条件的模式。如果找到匹配项,它会立即停止查找;否则返回None。

# 导包
import re
# search()方法:全局匹配,匹配第一个命中项
s1="1python 2python python"
result1=re.search("python",s1)
print(result1)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

输出结果:
< object; span=(1, 7), match=‘python’>

③findall方法
(匹配规则,被匹配字符串)
()方法:用于查找字符串中所有符合条件的匹配项。如果没有找到任何匹配项,返回一个空列表。该方法适用于需要提取多个匹配项的场景。

# 导包
import re
# findall()方法:全局匹配,匹配全部命中项
s1="1python 2python python"
s2="123456"
result1=re.findall("python",s1)
result2=re.findall("python",s2)
print(result1)
print(result2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

输出结果:
[‘python’, ‘python’, ‘python’]
[]

二、元字符匹配

常见的元字符匹配规则:

①字符集

元字符 描述
[] 匹配字符集合中的任意一个字符
[^] 匹配不在字符集合中的任意一个字符
- 在字符集合中表示字符范围

②特殊字符

元字符 描述
\ 转义字符,用于将特殊字符转换为普通字符
. 匹配除换行符以外的任意字符,如果设置 标志, 则可以匹配换行符
*、+、?、{、}、(、)、[、]、\、^、$、.、| 这些都是正则表达式的元字符,如果要匹配这些字符,需要加上转义字符 \

③单字符匹配

元字符 描述
. 匹配任意单个字符(换行符除外)
\d 匹配任意数字字符,等同于 [0-9]
\D 匹配任意非数字字符,等同于 [^0-9]
\w 匹配任意字母数字字符,等同于 [a-zA-Z0-9_]
\W 匹配任意非字母数字字符,等同于 [^a-zA-Z0-9_]
\s 匹配任意空白字符,包括空格、制表符、换行符等
\S 匹配任意非空白字符

④边界匹配

元字符 描述
^ 匹配字符串的开头
$ 匹配字符串的结尾
\b 匹配一个单词的边界
\B 匹配非单词边界

⑤数量匹配

元字符 描述
* 匹配前面的字符0次或多次
+ 匹配前面的字符1次或多次
? 匹配前面的字符0次或1次
{n} 匹配前面的字符n次
{n,} 匹配前面的字符至少n次
{n,m} 匹配前面的字符至少n次,最多m次

⑥分组匹配

元字符 描述
| 匹配左右任意一个表达式
() 将一个或多个字符捆绑在一起,形成一个独立的匹配单元

【示例】

import re
s="python @@hello world !!#¥% 123456 vue3"
result=re.findall(r'\d',s)
print(result)
  • 1
  • 2
  • 3
  • 4

输出结果:
[‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘3’]

【分析】
这段代码中,r'\d'中的r是正则表达式中的一个特殊字符,它代表"原始字符串"(raw string)。
原始字符串是一种特殊的字符串表示方式,在字符串文字前面加上前缀rR即可以创建一个原始字符串。在正则表达式中使用原始字符串,可以避免反斜杠被错误地解释为转义字符。
在正则表达式中,反斜杠\是一个特殊字符,用于表示各种特殊的字符匹配模式。比如\d表示匹配数字字符。
但是在 Python 中,反斜杠\也是一个特殊字符,用于表示字符串中的转义字符。比如\n 表示换行符。
如果我们在正则表达式中使用反斜杠\d,Python 会先对字符串进行转义,然后再交给正则表达式引擎处理。为了避免 Python 的字符串转义机制对正则表达式造成影响,可以使用原始字符串r'\d'来定义正则表达式模式,从而确保 \d 被正确地传递给正则表达式引擎。

import re
s="python @@hello world !!#¥% 123456 vue3"
result=re.findall(r'\W',s)
print(result)
  • 1
  • 2
  • 3
  • 4

输出结果:
[’ ', ‘@’, ‘@’, ’ ', ’ ', ‘!’, ‘!’, ‘#’, ‘¥’, ‘%’, ’ ', ’ ']

import re
s="python @@hello world !!#¥% 123456 vue3"
result=re.findall(r'[a-zA-Z]',s)
print(result)
  • 1
  • 2
  • 3
  • 4

输出结果:
[‘p’, ‘y’, ‘t’, ‘h’, ‘o’, ‘n’, ‘h’, ‘e’, ‘l’, ‘l’, ‘o’, ‘w’, ‘o’, ‘r’, ‘l’, ‘d’, ‘v’, ‘u’, ‘e’]

import re
s="python @@hello world !!#¥% 123456 vue3"
result=re.findall(r'[3-9]',s)
print(result)
  • 1
  • 2
  • 3
  • 4

输出结果:
[‘3’, ‘4’, ‘5’, ‘6’, ‘3’]

import re
# 匹配账号,只能由字母和数字组成,长度限制6-10位
r='^[a-zA-Z0-9]{6,10}$'
s1='1234567890123'
s2='1234567'
print(re.findall(r,s1))
print(re.findall(r,s2))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

输出结果:
[]
[‘1234567’]

import re
# 匹配QQ号,要求纯数字,长度5-11,第一位不为0
r='^[1-9][0-9]{4,10}$'
s1='012345678'
s2='123456789'
print(re.findall(r,s1))
print(re.findall(r,s2))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

输出结果:
[]
[‘123456789’]