Python 正则表达式学习(二)正则表达式语法

本文介绍了正则表达式的使用方法,包括单一字符匹配、多次匹配、字符串边界匹配及分组匹配等内容,并通过实例演示了如何进行精确的文本匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一,单一字符匹配:

(1)匹配任意字符: .    

import re
res = re.match(r'a..','abcd')
print(res.group())
#打印结果:abc
一点.表示匹配任意的字符。上面的代码表示匹配a后面的任意两个字符。必须从a开始。若写成 b.. 则会发生错误。



(2)匹配指定字符:[  ]

如   [ 0-9a-zA-Z ]   表示 匹配一个 0~9或所有英文字母

import re
res = re.match(r'[0-9a-zA-Z]',r'abc')
print(res.group())
#打印结果:a


(3)\d 和 \D:匹配数字和匹配非数字

import re
res = re.match(r'\d',r'123abc')
print(res.group())
#打印结果:1


(4)\s 和 \S :匹配空白字符和非空白字符(就是空格)


(5)\w 和 \W:匹配 0~9,a~z,A~Z的字符 和 非 0~9,a~z,A~Z的字符 

跟[ 0-9a-zA-Z ]作用相同


(6)\b 和 \B

\b的作用是匹配一个单词边界,即是单词和空间之间的位置

例如: er\b 可以匹配 never 中的 er ,但不能匹配 verb 中的 er

二,一次匹配多个字符

(1) *  匹配前一个字符0~无限次

import re
res = re.match('1*', r'112233abcd')
print(res.group())
#打印结果:11
上面的代码由于 *的前面是1,所以可以匹配无限个1(其实只有2兆多个)

import re
res = re.match(r'\w*', r'112233abcd')
print(res.group())
#打印结果:112233abcd
上面的代码则打印全部的字符串


(2)+ 匹配前一个字符 1~无限次

+ 与 * 的区别就是 + 不允许没有匹配到字符,而 * 可以不匹配到字符

import re
res = re.match(r'1+', r'112233abcd')
print(res.group())
#打印结果:11
若:

import re
res = re.match(r'0+', r'112233abcd')
print(res.group())
#打印结果:程序报错,因为字符串里没有0 


(3)?匹配前一个字符 0次或者1次

import re
res = re.match(r'1?', r'1112233abcd')
print(res.group())
#打印结果:1


(4){m} 和 {n,m}  匹配前一个字符m次 和 匹配前一个字符至少n次至多m次

import re
res = re.match(r'1{1,3}', r'111112233abcd')
print(res.group())
#打印结果:111


三,字符串边界匹配

(1)^ 和 $ 在字符串中

^用在字符串中表示匹配时,^后的第一个字符必须在字符串的第一个位置,而$则规定$前面的内容必须在字符串的最后才能匹配成功,如:

import re
#匹配电子邮箱
res = re.match(r'\w{3,10}@163.com$',r'zje@163.commm')
print(res.group())
#打印结果:程序出现错误,因为$表示所在位置必须是字符串的结尾

res = re.match(r'\w{3,10}@163.com$',r'zje@163.com')
print(res.group())
#打印结果:zje@163.com  

(2)\A 和 \Z

作用和 ^ 和 $ 一样。



四,分组匹配

(1) |

A|B 的作用是匹配 A 或 B,如:

import re
#匹配电子邮箱
res = re.match(r'\w+@(163|126|qq)\.com',r'zje@126.com')
print(res.group())
#打印结果:zje@126.com  
#这样写不仅可以匹配126的邮箱,还能匹配163和qq邮箱。

(2)分组(ab):作用是()中的ab被视为一个分组

import re
#匹配电子邮箱
reg = r'<(dir>)\w+</\1'
str = r'<dir>test_zje</dir>'
res = re.match(reg,str)
print(res.group())
#打印结果:<dir>test_zje</dir>
#上面的代码 括号()括起了 dir>  表示 dir> 为第一个分组,所以后面的\1 就表示第一个分组 dir> 

当然也可以给分组起一个名字,用名字来引用分组,如:

import re
#匹配电子邮箱
reg = r'<(?P<mark>[\w]+>).+</(?P=mark)'
str = r'<dir>test_zje</dir>'
res = re.match(reg,str)
print(res.group())
#打印结果:<dir>test_zje</dir>
#上面的代码 把第一个分组命名为 mark,然后(?P=mark)表示引用一个命名为mark的分组



(3)向前向后查找

只有在组内才能向前向后查找

如在字符串 src="http://www.xxxxxxx.jpg" 中的 http://www.xxxxxxx.jpg

正则可以这样写: reg = r' ((?<=src=")http://www.xxxxxxx.1.jpg(?=") ) '

前面的(?<=src=)表示若字符串中有 “src=” 这个字符串则匹配,但不返回 “src=“ 这个字符串,用在正则表达式之前

后面的(?=")表示若字符串中有 双引号“ 则匹配,但不返回 双引号” ,用在正则表达式之后。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值