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 [email protected]."

m =  re.search(p1, text)#p1与text匹配
#输出为<_sre.SRE_Match object; span=(16, 45), match='[email protected]'>
print(m) 


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

email = '[email protected]'
m =  re.search(p2, email)#p2与email匹配
#输出为<_sre.SRE_Match object; span=(0, 29), match='[email protected]'>
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\d{3,4})-(?P\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]+)>.*'  #这是正常分组
m = re.search(p, 'aaa')

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

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

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

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']

你可能感兴趣的:(python3,re)