python3-re

python3中正表达式中的用法笔记

由于自己对正则表达式不是很熟悉,自己就重新学习了一下这个正则表达式。下面是我学习正则表达式的一些笔记,自己主要是用于备忘与查询

1、元字符

序号字符说明
1\转义符,表示转义
2.表示任意一个字符
3+重复一次或者多次
4*重复零次或者多次
5?重复零次或者一次
6|选择符号,表示“或关系”,例如A|B 表示匹配A或B
7{}定义量词
8[]定义字符类
9()定义分组
10^可以表示取反, 或者匹配一行的开始
11$匹配一行的结束
import re
p1 = r'\w+@zhijieketang\.com'  #没有规定字符位置匹配字符
p2 = r'^\w+@zhijieketang\.com$'  #规定了必须要以.com结尾

text = "Tony's email is tony_guan588@zhijieketang.com."

m =  re.search(p1, text)#p1与text匹配
#输出为<_sre.SRE_Match object; span=(16, 45), match='tony_guan588@zhijieketang.com'>
print(m) 


m =  re.search(p2, text) #p2与text匹配
#输出为None
print(m)

email = 'tony_guan588@zhijieketang.com'
m =  re.search(p2, email)#p2与email匹配
#输出为<_sre.SRE_Match object; span=(0, 29), match='tony_guan588@zhijieketang.com'>
print(m)

2、预定义字符类

== 这里包括一些长用的字符表现形式,我们在c语言中经常使用 ==

字符说明
.匹配任意一个字符
\\匹配反斜杠\字符
\n匹配换行
\r匹配回车
\f匹配一个换页符
\t匹配一个水平制表符
\v匹配一个垂直制表符
\s匹配一个空格符,等价于[\n\r\f\t\v]
\S匹配一个非空格符,等价于[^\s]
\d匹配一个数字字符,等价于[0-9]
\D匹配一个非数字字符,等价于[^0-9]
\w匹配任何语言的单词字符(如:英文字母、亚洲文字)、数字和下划线(_)等字符。如果正则表达式编译标志设置为ASCII,则指匹配[a-z0-9A-Z]
\W相当于[6\w]

3、字符类

这里主要包含着如何定义一个字符类(与其他的字符类是
不同的这里面主要使用 [] 来做定义类。)

r'[0123456789]' 表示数字集

r'[^0123456789]' 表示非数字集

4、区间

区间是用 - 表示的

数字字符类 [0123456789] 表示为 [0-9]


区间主要是使用在如果使用字符类, 则串里面的内容比较长,如果使用区间表示比较简单
小写字母字符类 [a-z]
大写字母字符类 [A-z]
还可以使用间隔 [0-25-7]表示0、1、2、5、6、7

5、量词

字符说明
出现==一==次或==零==次
*出现==多==次或==零==次
+出现==一==次或==多==次
{n}出现==零==或==n==次
{n,m}至少出现==n==次,但不超过==m==次
{n,}至少出现n次
{n, m}?只匹配5个,惰性量词

6、分组

自此之前学习量词只能重复显示一个字符, 如果想让一个字符串作为整体使用量词,可将这个字符串发放到一对小括号中。这就是分组。

import re

p = r'(121){2}' #正则表达式,并且创建分组(121)并且重复2次
m = re.search(p, '121121abcabc')

print(m)
print(m.group()) #返回匹配的字符串 打印121121
print(m.group(1)) #返回自一个组的内容 打印121
print(m.groups()) #返回所有组的内容 打印('121',)

p = r'(121){2}(abc){2}'
m = re.search(p, '121121abcabc')
print(m.group()) #打印121121abcabc
print(m.group(1)) #打印121
print(m.groups()) #打印('121', 'abc')
6.1 分组名

分组还可以通过分组名字来访问

格式:p = r’(?P\d{3,4})-(?P\d{7,8})’

(?P匹配串)

import re

p = r'(\d{3,4})-(\d{7,8})' #正则表达式,建立区号和电话号码
m = re.search(p, '0792-87654321')

print(m)
print(m.group(1)) 
print(m.group(2)) 
print(m.groups())
'''
<_sre.SRE_Match object; span=(0, 13), match='0792-87654321'>
0792
87654321
('0792', '87654321')
'''

p = r'(?P<area_code>\d{3,4})-(?P<num_code>\d{7,8})' #区号命名为area_code,电话号码命名为num_code
m = re.search(p, '0792-87654321')

print(m.group(1)) #通过分组号访问
print(m.group(2)) 
print(m.group("area_code"))  #通过定义的名字来访问 
print(m.group("num_code")) 
'''
0792
87654321
0792
87654321
'''
#通过名字与编号访问结果式一样的
6.2反向引用分组

通过反向引用分组能获取特定的标签

import re
p = r'<([\w]+)>.*</([\w]+)>'  #这是正常分组
m = re.search(p, '<a>aaa</a>')

print(m) #能但会匹配结果
m = re.search(p, '<a>aaa</b>')

print(m) #能返回匹配结果
p = r'<([\w]+)>.*</\1>'  #这是反向引用分组
m = re.search(p, '<a>aaa</a>')

print(m) #能返回匹配结果
m = re.search(p, '<a>aaa</b>')

print(m) #不能返回,直接返回None
6.3非捕获分组

在日常的时候我们,有时候想要返回某个文件的内容,返货全部的名称。但是使用普通的分组是不能使用的,这个时候我们需要使用非捕获分组

import re 
s = 'img1.jpg, img2.jpg, img3.bmp'
p = r'\w+(\.jpg)'  #正常分组
m = re.findall(p, s) 
print(m)  #输出['.jpg', '.jpg']
p = r'\w+(?:\.jpg)'  #采用非捕获分组
m = re.findall(p, s) 
print(m) #输出['img1.jpg', 'img2.jpg']
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值