Python 正则表达式详解(re)

本文详细介绍了Python中的正则表达式,包括match(), search(), compile()的基本用法,以及findall(), finditer()的全匹配功能。此外,还展示了如何使用sub()进行字符串替换和split()拆分字符串。通过实例演示,帮助读者理解并掌握这些核心技术。
摘要由CSDN通过智能技术生成

1 概述

  • 正则表达式是一个特殊的字符序列,方便检查一个字符串是否与某种模式匹配
  • 以下仅为日常使用部分

1.1 模式 pattern

常用模式描述举例
^匹配字符串的开头
$匹配字符串的末尾
.匹配任意字符,除了换行符
a|b匹配 a 或者 b
[..]匹配一组字符,如:[abc]:匹配 a、b、c反例 = [^..]
*匹配 0 个或 多个表达式
+匹配 1 个或 多个表达式
?匹配 0 个或 1 个表达式
{n}匹配 n 个表达式
{n, m}匹配 n 至 m 个表达式
{n, }匹配 >= n 个表达式
\w匹配字母、数字及下划线反例 = \W
\s匹配任意空白字符反例= \S
\d匹配任意数字,等价 [0-9]反例 = \D
a-z匹配小写字母 a,b,c 一直到 z
A-Z匹配大写字母 A,B,C 一直到 Z
0-9匹配数字 0,1,2 一直到 9
import re

# 从 www.baidu.com 中匹配至少一个包含 a或b
s1 = re.search('[ab]+', 'www.baidu.com')

print(s1.group())  # ba

1.2 标志位 flags

修饰符描述
re.I使匹配对大小写不敏感
re.S使 . 匹配包括换行在内的所有字符
import re

# re.I 忽略大小写
m1 = re.match('WWW', 'www.baidu.com')
m2 = re.match('WWW', 'www.baidu.com', re.I)

# re.S 使 . 匹配包括换行(\n)在内的所有字符
m3 = re.match('www.', 'www\nbaidu.com')
m4 = re.match('www.', 'www\nbaidu.com', re.S)

# 还有其他的,如 re.X, re.M 等等,比较少用,不再展开
print(m1)  # None
print(m2)  # <re.Match object; span=(0, 3), match='www'>
print(m3)  # None
print(m4)  # <re.Match object; span=(0, 4), match='www\n'>

2 语法

2.1 match():从起始位置开始匹配

# 函数语法:从字符串的起始位置匹配一个模式
# 若成功,则返回具体信息,反之返回 None
re.match(pattern, string, flags=0)
# 案例:从 string 中找到 pattern
import re

m1 = re.match('www', 'www.baidu.com')
m2 = re.match('baidu', 'www.baidu.com')

print(m1)  # <re.Match object; span=(0, 3), match='www'>
print(m2)  # None

# .span(): 位置  .group(): 值
print(m1.span())  # (0, 3)
print(m1.group())  # www

2.2 search():匹配整个字符串,找到第一个匹配

# 函数语法:匹配整个字符串,找到第一个匹配
# 若成功,则返回具体信息,反之返回 None
re.search(pattern, string, flags=0)
import re

s1 = re.search('www', 'www.baidu.com')
s2 = re.search('com', 'www.baidu.com')
s3 = re.search('xxx', 'www.baidu.com')

print(s1)  # <re.Match object; span=(0, 3), match='www'>
print(s2)  # <re.Match object; span=(10, 13), match='com'>
print(s3)  # None

print(s1.span())  # (0, 3)
print(s1.group())  # www

2.3 compile():按正则模式匹配字符串

# 函数语法:按正则模式匹配字符串
# 若成功,则返回具体信息,反之返回 None
re.compile(pattern[, flags])
import re

patter_format = re.compile(r'\d+')  # 至少匹配一个数字

# 注:下标是从 0 开始的哦
print(patter_format.match('阿梦520', 2, 5))  # 下标从 2 开始,5 结束
# 输出 520

2.4 findall():匹配所有字符串

  • match 和 search 是匹配一次,findall 是匹配所有
# 请注意 match 和 search 是匹配一次,findall 匹配所有
re.findall(string[, pos[, endpos]])  # return list
re.finditer(pattern, string, flags=0)  # 同 findall,return 迭代器

# string: 原字符串
# pos:开始位置,默认 0 
# endpos:结束位置,默认 字符串的长度
# 匹配范围:含头(pos),不含尾(endpos)
import re

f1 = re.findall(r'\d+', '阿梦520 - 1314', 2)

print(f1)  # ['520', '1314']

2.6 finditer():findall 的迭代器

import re

f1 = re.finditer(r'\d+', '阿梦520 - 1314', 2)

for m in f1:
    print(m.span(), m.group()

# (2, 5) 520
# (8, 12) 1314

2.7 sub():替换字符串

re.sub(pattern, repl, string, count=0, flags=0)

# pattern:正则表达式模式
# repl:替换后的字符串
# string:原字符串
# count=0:匹配次数,0:替换所有的匹配
# flags=0:标志位
import re

str = '阿梦:151-2345-6789'

# 将任意非数字替换为空
s1 = re.sub('\D+', '', str)
print(s1)  # 15123456789

2.8 split():拆分字符串

re.split(pattern, string[, maxsplit=0, flags=0])

# pattern:正则表达式模式
# string:原字符串
# maxsplit:分割次数。默认 0:不限制
# flags:标志位
import re

# 按 非字符、数字、下划线 拆分字符串
s1 = re.split(r'\W+', '阿梦,520,阿优')

print(s1)  # ['阿梦', '520', '阿优']

3 实例

3.1 去除汉字

import re

str_test = 'abcABC_(123).这是一个汉字'

s1 = re.sub('[^a-zA-Z_0-9().]+', '', str_test)
s2 = re.sub('[a-zA-Z_0-9().]+', '', str_test)


print(f'去除汉字后:{s1}')  # abcABC_(123).
print(f'只保留汉字:{s2}')  # 这是一个汉字
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼丸丶粗面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值