python——re模块

简介

定义:re模块称为正则表达式;
作用:创建一个"规则表达式",用于验证和查找符合规则的文本,广泛用于各种搜索引擎、账户密码的验证等;(即:匹配处理字符串)

预定义字符

  • \d 匹配所有的十进制数字 0-9
  • \D 匹配所有的非数字,包含下划线
  • \s 匹配所有空白字符(空格、TAB等)
  • \S 匹配所有非空白字符,包含下划线
  • \w 匹配所有字母、汉字、数字 a-z A-Z 0-9
  • \W 匹配所有非字母、汉字、数字,包含下划线

特殊字符

1、$:匹配一行的结尾(必须放在正则表达式最后面)

2、^:匹配一行的开头(必须放在正则表达式最前面)

3、*:前面的字符可以出现0次或多次(0~无限)

4、+:前面的字符可以出现1次或多次(1~无限)

5、:变"贪婪模式"为"勉强模式",前面的字符可以出现0次或1次

6、.:匹配除了换行符"\n"之外的任意单个字符

7、|:两项都进行匹配

8、[ ]:代表一个集合,有如下三种情况

  • [abc]:能匹配其中的单个字符
  • [a-z0-9]:能匹配指定范围的字符,可取反(在最前面加入^)
  • [2-9] [1-3]:能够做组合匹配
    9、{ }:用于标记前面的字符出现的频率,有如下情况:
  • {n,m}:代表前面字符最少出现n次,最多出现m次
  • {n,}:代表前面字符最少出现n次,最多不受限制
  • {,m}:代表前面字符最多出现n次,最少不受限制
  • {n}:前面的字符必须出现n次

反斜杠问题

字符串中有反斜杠的,需要对反斜杠做转义:

str = "\123 223"    # S 223
str = "\\123 223"   # \123 223
str = r"\123 223"   # \123 223

函数介绍

compile()函数

定义:

compile(pattern, flags=0) 
Compile a regular expression pattern, returning a pattern object.

从compile()函数的定义中,可以看出返回的是一个匹配对象,它单独使用就没有任何意义,需要和findall(), search(), match()等搭配使用。
隐藏的compile()函数——
正常情况下 我们使用re模块时,我们都是先调用re模块的complie函数生成成pattern对象,使用pattern对象调用相应的方法进行正则匹配。e.g.,:

import re
pattern = re.compile('正则表达式')
text = '一段字符串'
result = pattern.findall(text)

但是在Python里面,在大多数情况下不需要使用re.compile!直接使用re.对应的方法(pattern, string, flags=0)就可以了。其原因就是热模块将complie函数的调用放在了对应的方法(pattern, string, flags=0)中了。我们常用的正则表达式方法,无论是findall还是search还是sub还是match,其返回值全部都是这样写的:

_compile(pattern, flag).对应的方法(string)

match()函数

从头匹配一个符合规则的字符串,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None。

match(pattern, string, flags=0)
# pattern: 正则模型
# string : 要匹配的字符串
# falgs : 匹配模式

e.g.,

import  re
str="hello egon bcd egon lge egon acd 19"
r=re.match("h\w+",str) #match,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None,非字母,汉字,数字及下划线分割
print(r.group()) # 获取匹配到的所有结果,不管有没有分组将匹配到的全部拿出来
print(r.groups()) # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分的结果
print(r.groupdict())  # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分定义了key的组结果
# hello
# ()
# {}

r2=re.match("h(\w+)",str) #match,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None
print(r2.group())
print(r2.groups())
print(r2.groupdict())

# hello
# ('ello',)
# {}

r3=re.match("(?P<n1>h)(?P<n2>\w+)",str)  #?P<>定义组里匹配内容的key(键),<>里面写key名称,值就是匹配到的内容
print(r3.group())
print(r3.groups())
print(r3.groupdict())

# hello
# ('h', 'ello')
# {'n1': 'h', 'n2': 'ello'}

search()函数

浏览全部字符串,匹配第一符合规则的字符串,浏览整个字符串去匹配第一个,未匹配成功返回None。

search(pattern, string, flags=0)
# pattern: 正则模型
# string : 要匹配的字符串
# falgs : 匹配模式

注意:match()函数 与 search()函数基本是一样的功能,不一样的就是match()匹配字符串开始位置的一个符合规则的字符串,search()是在字符串全局匹配第一个合规则的字符串。
e.g.,

import  re
str="hello egon bcd egon lge egon acd 19"
r=re.search("b\w+",str) #match,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None,非字母,汉字,数字及下划线分割
print(r.group()) # 获取匹配到的所有结果,不管有没有分组将匹配到的全部拿出来
print(r.groups()) # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分的结果
print(r.groupdict())  # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分定义了key的组结果

# bcd
# ()
# {}

r2=re.search("b(\w+)",str) #match,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None
print(r2.group())
print(r2.groups())
print(r2.groupdict())

# bcd
# ('cd',)
# {}

r3=re.search("(?P<n1>b)(?P<n2>\w+)",str)  #?P<>定义组里匹配内容的key(键),<>里面写key名称,值就是匹配到的内容
print(r3.group())
print(r3.groups())
print(r3.groupdict())

# hello
# ('b', 'cd')
# {'n1': 'b', 'n2': 'cd'}

findall()函数

浏览全部字符串,匹配所有合规则的字符串,匹配到的字符串放到一个列表中,未匹配成功返回空列表。

findall(pattern, string, flags=0)
# pattern: 正则模型
# string : 要匹配的字符串
# falgs : 匹配模式

注意: 一旦匹配成,再次匹配,是从前一次匹配成功的,后面一位开始的,也可以理解为匹配成功的字符串,不在参与下次匹配。

import re
r=re.findall("\d+\w\d+","a2b3c4d5") #浏览全部字符串,匹配所有合规则的字符串,匹配到的字符串方到一个列表中
print(r)
# ['2b3', '4d5'] #匹配成功的字符串,不再参与下次匹配,所以3c4也符合规则但是没有匹配到

注意:如果没写匹配规则,也就是空规则,返回的是一个比原始字符串多一位的,空字符串列表。

'''
注意:如果没写匹配规则,也就是空规则,返回的是一个比原始字符串多一位的,空字符串列表
'''
import re
r=re.findall("","a2b3c4d5") #浏览全部字符串,匹配所有合规则的字符串,匹配到的字符串方到一个列表中
print(r)
# ['', '', '', '', '', '', '', '', ''] #如果没有写匹配规则,也就是空规则,返回的是一个比原始字符串多一位的空字符串列表,如上是8个字符,返回是9个空字符

注意:正则匹配到空字符的情况,如果规则里只有一个组,而组后面是就表示组里的内容可以是0个或者多过,这样组里就有了两个意思,一个意思是匹配组里的内容,二个意思是匹配组里0内容(即是空白)所以尽量避免用否则会有可能匹配出空字符串。
注意:正则只拿组里最后一位,如果规则里只有一个组,匹配到的字符串里在拿组内容是,拿的是匹配到的内容最后一位。

import re
r=re.findall("(ca)*","ca2b3caa4d5") 
print(r)
# ['ca', '', '', '', 'ca', '', '', '', '', '']#用*号会匹配出空字符

无分组:匹配所有合规则的字符串,匹配到的字符串放到一个列表中。

import re
r=re.findall("a\w+","ca2b3 caa4d5") 
print(r)
# ['a2b3', 'aa4d5']#匹配所有合规则的字符串,匹配到的字符串放入列表

有分组:只将匹配到的字符串里,组的部分放到列表里返回,相当于groups()方法。

import re
r=re.findall("a(\w+)","ca2b3 caa4d5") 
print(r)
# ['2b3', 'a4d5']#返回匹配到组里的内容返回

多个分组:只将匹配到的字符串里,组的部分放到一个元组中,最后将所有元组放到一个列表里返回。相当于在group()结果里再将组的部分分别拿出来放入一个元组,最后将所有元组放入一个列表返回。

import re
r=re.findall("(a)(\w+)","ca2b3 caa4d5") 
print(r)
# [('a', '2b3'), ('a', 'a4d5')]#返回的是多维数组

分组中有分组:只将匹配到的字符串里,组的部分放到一个元组中,先将包含有组的组,看作一个整体也就是一个组,把这个整体组放入一个元组里,然后在把组里的组放入一个元组,最后将所有组放入一个列表返回。

import re
r=re.findall("(a)(\w+(b))","ca2b3 caa4b5") 
print(r)
# [('a', '2b', 'b'), ('a', 'a4b', 'b')]#返回的是多维数组

?: 在有分组的情况下findall()函数,不只拿分组里的字符串,拿所有匹配到的字符串,注意?:只用于不是返回正则对象的函数如findall()

import re
r=re.findall("a(?:\w+)","a2b3 a4b5 edd") 
print(r)
# ['a2b3', 'a4b5']

split()函数

根据正则匹配分割字符串,返回分割后的一个列表。

split(pattern, string, maxsplit=0, flags=0)
# pattern: 正则模型
# string : 要匹配的字符串
# maxsplit:指定分割个数
# flags  : 匹配模式

e.g.,

import  re
r=re.split("a\w","sdfadfdfadsfsfafsff")
print(r)
r2=re.split("a\w","sdfadfdfadsfsfafsff",maxsplit=2)
print(r2)

# ['sdf', 'fdf', 'sfsf', 'sff']
# ['sdf', 'fdf', 'sfsfafsff']

sub()函数

替换匹配成功的指定位置字符串。

sub(pattern, repl, string, count=0, flags=0)
# pattern: 正则模型
# repl   : 要替换的字符串
# string : 要匹配的字符串
# count  : 指定匹配个数
# flags  : 匹配模式

e.g.,

import  re
r=re.sub("a\w","替换","sdfadfdfadsfsfafsff")
print(r)
# sdf替换fdf替换sfsf替换sff

subn()函数

替换匹配成功的指定位置字符串,并且返回替换次数,可以用两个变量分别接受。

subn(pattern, repl, string, count=0, flags=0)
# pattern: 正则模型
# repl   : 要替换的字符串
# string : 要匹配的字符串
# count  : 指定匹配个数
# flags  : 匹配模式

e.g.,

import  re
a,b=re.subn("a\w","替换","sdfadfdfadsfsfafsff") #替换匹配成功的指定位置字符串,并且返回替换次数,可以用两个变量分别接受
print(a) #返回替换后的字符串
print(b) #返回替换次数
# sdf替换fdf替换sfsf替换sff
# 3

参考资料
https://www.jb51.net/article/223741.htm
https://blog.csdn.net/m0_43609475/article/details/119924047

posted @ 2022-05-25 18:05  岸南  阅读(58)  评论(0)    收藏  举报