目录
一、正则表达式的概述:英文名为 Regular Expression,又称规则表达式。正则表达式常被用来检索、替换符合某些规则的文本内容。其离不开re模块。
#正则表达式前面加个r,则原生的字符串不会出现转义现象
一、正则表达式的概述:英文名为 Regular Expression,又称规则表达式。正则表达式常被用来检索、替换符合某些规则的文本内容。其离不开re模块。
二、re模块以及部分方法示例
- 在使用re模块,必须先导入re模块 import re
# re.match 方法
#示例1
#re.match. 是从字符串的起始位置匹配一个规则,成功则返回match对象,否则为None
#match 只能匹配以xxx开头的字符串
#re.match(匹配的正则表达式,要匹配的对象,标志位(控制匹配方式))
#group()可以获取匹配成功的字符串
import re #导入re模块
str = 'python is a 好 学科' #这里是一个字符串
a = re.match('p',str) #使用re.match(),正则表达式是p,对象为str,没有设置标志位
a.group() #获取匹配成功的字符串,如果匹配失败则报错
结果:
'p'
#示例2
import re #导入re模块
str = 'python is a good 学科 !' #这里是一个字符串
a = re.match('p',str) #使用re.match(),正则表达式是p,对象为str,没有设置标志位
if a: #这里使用if-else 来判断是否匹配成功,成功则输出,反之为None
print('成功')
print(a)
else:
print('失败')
print(a)
结果:
成功
<re.Match object; span=(0, 1), match='p'>
-
re.match方法关于标志位
修饰符 | 具体描述 |
re.I | 使匹配对 大小写 不敏感 |
re.L | 做本地化识别匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符,这个标志影响 \w 、\W、 \b 、\b |
re.X | 该标志通过给予你更灵活的格式让你将正则表达式写的更容易理解 |
#示例1
import re #导入re模块
str = 'Python is a good 学科 !' #这里是一个字符串
a = re.match('p',str,re.I) #使用re.match(),匹配的正则表达式是p,对象为str,标志位 re.I
if a: #这里使用if-else 来判断是否匹配成功,成功则输出,反之为None
print('匹配成功')
print(a)
else:
print('匹配失败')
print(a)
结果:
匹配成功
<re.Match object; span=(0, 1), match='p'>
#可以看到字符串开头为大写P,,而规则是小写,加上标志位后匹配成功
-
#group(num)或者 groups()
- 匹配对象来获取正则表达式,前者如果有多个匹配结果,将会以元组的形式存在group对象中,此时可通过索引下表去获取
匹配对象方法 | 具体描述 |
group(num=0) | 匹配的整个表达式的字符串,group()可以一次输入多个组号,在这种情况下他将返回一个包含那些组所对应值的元组 |
groups() | 返回一个包含所有小组字符串的元组,从1到所含的小组号 |
三、关于正则表达式的规则
符号 | 匹配规则 |
---|---|
. (点) | 匹配任何一个字符,除了换行符\n |
[abc] | 匹配abc中的任意一个字符 |
\d | 匹配一个数字,即0~9 |
\D | 匹配非数字,即不是数字的 |
\s | 匹配空白,即空格,tab键 |
\S | 匹配非空白,除了空格,tab键之类的 |
\w | 匹配单词字符,即a-z,A-Z,0-9, |
\W | 匹配非单词字符 |
#示例1,'.'的使用,匹配除了换行符以外所有的字符
import re #导入re模块
a = 'ab66cdefghijk123' #定义一个字符串a
b = '....' #提前设置下方match的匹配正则表达式规则,此处意为匹配4个字符
result = re.match(b,a) #使用re.match方法,正则表达式规则为上方的b,匹配对象为a,标志位默认为0
print(result.group()) #使用group()方法获取匹配对象的结果
结果:
ab66
#示例2,'[abc]'的使用,匹配这里的中括号中的任意一个字符
#'[abc]',代表可以匹配a,也可以匹配b,或者c
#下面因为用了re.match方法,所以受到了一定的限制,只能从字符串首字符开始匹配
import re #导入re模块
str1 = 'hello world' #定义字符串str1
result = re.match('[ho]',str1) #使用re.match方法,匹配的正则表达式为[he],此处获取字符串里面的h
print(result.group()) #使用group()方法获取匹配对象的结果
结果:
h
#将[abc]里面的改变一下
import re #导入re模块
str1 = 'hello world' #定义字符串str1
result = re.match('[ohppp]',str1) #使用re.match方法,匹配的正则表达式为[he]
#此处获取字符串里面的h
print(result.group()) #使用group()方法获取匹配对象的结果
结果:
h
#示例3,'\w'的使用,匹配单词字符,即a-z,A-Z,0-9
#下面因为用了re.match方法,所以受到了一定的限制,只能从字符串首字符开始匹配
import re #导入re模块
str1= 'a','b','c','d','wgf' #定义字符串str1
for i in str1: #利用for循环遍历字符串,每次的对象为一个字符存放i
result = re.match('\w',i) #使用re.result方法,匹配的正则表达式规则为\w
if result: #如果result不为空,则用group()获取匹配对象的结果
print('匹配成功%s'%result.group())
结果:
匹配成功a
匹配成功b
匹配成功c
匹配成功d
匹配成功w
#把\w 换成[a-z],输出的结果与\w 一样
import re #导入re模块
str1= 'a','b','c','d','wgf' #定义字符串str1
for i in str1: #利用for循环遍历字符串,每次的对象为一个字符存放i
result = re.match('\w',i) #使用re.result方法,匹配的正则表达式规则为[a-z]
if result: #如果result不为空,则用group()获取匹配对象的结果
print('匹配成功%s'%result.group())
结果:
匹配成功a
匹配成功b
匹配成功c
匹配成功d
匹配成功w
四、正则表达式——懒惰与贪婪模式
- 贪婪模式:正则表达式匹配时,会尽量多地匹配符合条件的内容
- 懒惰模式:正则表达式匹配时,会尽量少地匹配符号条件的内容
贪婪模式标识符 | 具体描述 |
---|---|
+ | 匹配前一个字符1次或者多次(至少有一次) |
? | 匹配前一个字符0次或者1次(要么一次要么无) |
* | 匹配前一个字符0次或者多次(可有可无) |
{n} | 匹配前一个字符重复n次 |
{n,m} | 匹配前一个重复n到m次,其中第m次可省略 |
非贪婪模式的标识符 |
---|
+? |
?? |
*? |
{n}? |
{n,m}? |
#示例1
import re #导入re模块
result = re.match('[A-Z]*[a-z]*', 'MMMaaaa123') #使用re.match方法
#匹配规则有两个,大写A-Z和小写a-z,重复0或多次
print(result.group()) #使用group方法获取匹配对象的结果
结果:
MMMaaaa
#示例2
import re #导入re模块
result = re.match('[A-Z]*[a-z]{4}[0-9]{3}', 'MMMabcd123') #使用re.match方法
#匹配规则有三个
#大写A-Z 重复0或多次
#小写a-z 重复4次(多了少了都不行)
#数字0-9 重复3次(多了少了都不行)
print(result.group()) #使用group方法获取匹配对象的结果
结果:
MMMabcd123
#示例3 不限定大小写
ort re #导入re模块
result = re.match('[a-zA-Z]+', 'aMMaaMMMaaabcd') #使用re.match方法
#这样的写法为不限定大小写
print(result.group()) #使用group方法获取匹配对象的结果
结果:
aMMaaMMMaaabcd
#示例4
import re #导入re模块
result = re.match('[a-zA-Z_]+[\w]*','name45')#规则1为不限定大小写并重复1次或多次
#规则2为单词字符并重复0次或多次
print(result.group()) #使用group方法获取匹配对象的结果
结果:
name45
#示例5
import re #导入re模块
str1 = '123456abcd' #自定义字符串str1
result = re.match('\w{5}',str1) #使用re.match方法,规则为单词字符重复5次,对象为str1
if result:
print('匹配成功!')
print(result)
else:
print('匹配失败')
print(result)
结果:
匹配成功!
<re.Match object; span=(0, 5), match='12345'>
#示例6
import re #导入re模块
str1 = '123456abcd' #自定义字符串str1
result = re.match('\w{0,4}',str1) #使用re.match方法,规则为单词字符重复0-4次,对象为str1
if result: #(不包括第4)
print('匹配成功!')
print(result)
else:
print('匹配失败')
print(result)
结果:
匹配成功!
<re.Match object; span=(0, 4), match='1234'>
#正则表达式前面加个r,则原生的字符串不会出现转义现象
#示例7
import re #导入re模块
str1 = 'c:\\tabc.a\\sv' #自定义字符串
result1 = re.match(r'c:\\tabc.a\\sv',str1) #规则为整个字符串,字符串含有\\,则必须在前面加上r
print(result1.group()) #打印group读取rematch的结果
结果:
c:\\tabc.a\\sv
#示例8,示例7的反例
import re #导入re模块
str1 = 'c:\\tabc.a\\sv' #自定义字符串
result1 = re.match('c:\\tabc.a\\sv',str1) #规则为整个字符串,字符串含有\\,不在前面加上r
print(result1.group()) #打印group读取rematch的结果
结果:
结果报错
AttributeError: 'NoneType' object has no attribute 'group'
#匹配开头 ^ 和结尾 $
#示例9,限定开头
import re #导入re模块
str1 = '123abcd' #自定义字符串1
str2 = 'abcd123' #自定义字符串2
result1 = re.match('^1\w+',str1) #限定匹配开头为1
result2 = re.match('^1\w+',str2) #限定匹配开头为1
print(result1.group()) #使用group方法读取match的匹配结果
print(result2.group()) #使用group方法读取match的匹配结果
结果:
123abcd
结果报错
AttributeError: 'NoneType' object has no attribute 'group'
#示例10 限定结尾
import re #导入re模块
str1 = 'abcd1234@qq.com' #自定义一个邮箱
result = re.match('\w{0,15}@\w{0,10}.com$',str1) #这里限定的结尾为com
print(result.group()) #利用group方法读取match匹配的结果
结果:
abcd1234@qq.com
#示例11 示例10的返例
import re #导入re模块
str1 = 'abcd1234@qq.com11' #自定义一个邮箱
result = re.match('\w{0,15}@\w{0,10}.com$',str1) #这里限定的结尾为com
print(result.group()) #利用group方法读取match匹配的结果
结果:
结果报错
AttributeError: 'NoneType' object has no attribute 'group'
五、分组匹配
符号 | 匹配规则 |
| | 匹配左右任意一个表达式(要么是左边的要么是右边的匹配) |
(ab) | 将括号中字符作为一个分组 |
num | 引用分组num匹配到的字符 |
(?p) | 分组起别名 |
(?p=name) | 引用别名为name分组匹配到的字符串 |
#匹配数字
import re #导入re模块
str1 = '12' #自定义字符串
str2 = '100' #自定义字符串
result = re.match('[1-9]?\d$|100',str1) #这里有|,代表左右两边各一个表达式
result = re.match('[1-9]?\d$|100',str2) #左边的为[1-9],右边的为100 ,限定结尾都为数字
print(result.group())、
结果:
12
100
#匹配电话号码1 xxxx-xxxxxxx
import re #导入re模块
number = '0758-183316755' #自定义电话号码
result = re.match('([0-9]+)-([0-9]+)',number) #分成两组表达式
print(result.group())
print(result.group(1)) #第一组表达式匹配结果
print(result.group(2)) #第二组表达式匹配结果
结果:
0758-183316755
0758
183316755
#匹配电话号码2 xxxx-xxxxxxx
import re #导入re模块
number = '0758-183316755' #自定义电话号码
result = re.match('([^-]+)-([0-9]+)',number) #分成两组表达式
#注意这里^-表示取反,匹配出不是 - 的
print(result.group())
print(result.group(1)) #第一组表达式匹配结果
print(result.group(2)) #第二组表达式匹配结果
结果:
0758-183316755
0758
183316755
#\num的使用
import re #导入re模块
htmlTag = '<html><h1>测试数据</h1></html>' #自定义字符串
result = re.match(r'<(.+)><(.+)>(.+)</\2></\1>',htmlTag)
#这里\2和\1表示引用前面的分组2和分组1
print(result.group()) #利用group得到match匹配的完全结果
print(result.group(1)) #利用group得到match匹配的第一组结果
print(result.group(2)) #利用group得到match匹配的第二组结果
print(result.group(3)) #利用group得到match匹配的第三组结果
结果:
<html><h1>测试数据</h1></html>
html
h1
测试数据
import re #导入re模块
data = '<div><h1>www.baidu.com</h1></div>' #自定义字符串
result = re.match('<(\w+)><(\w+)>.*</\w+></\w+>',data)
#这里\w+表示引用前面得分组
print(result.group()) #利用group得到match匹配的完全结果
结果:
<div><h1>www.baidu.com</h1></div>
# (?P) 分组起别名
import re #导入re模块
data = '<div><h1>www.baidu.com</h1></div>' #自定义字符串
result = re.match('<(?P<one>\w+)><(?P<two>\w+)>.*</(?P=two)></(?P=one)>',data)
#起了第一组别名为?P<one>,第二组?P<two
print(result.group()) 利用group方法读取match匹配的结果
结果:
<div><h1>www.baidu.com</h1></div>
六、re.compile方法
- compile将正则表达式模式编译为一个正则表达式对象
- re.compile(pattern,flag=0)
- 等效于result = re.match (pattern,string)
#示例1
import re #导入re模块
str=re.compile('\d{4}') #利用compile将str编译为一个pattern对象
result=str.match('1234567')#调用对象str
print(result.group())
result=str.match('2222267')
print(result.group())
result=str.match('3333267')
print(result.group())
结果:
1234
2222
3333
以下为compile方法常见使用搭配得方法
- match 方法——可返回一个class、str、tuple。但是一定需要注意match(),从位置0开始匹配,匹配不到会返回None(并且和group搭配使用)
- search 方法——返回的与match类似,但是可以不从0开始匹配。当匹配一个单词之后,匹配和match()一样,匹配就会结束
- findall 方法 ——返回一个列表
#示例
import re #导入re模块
str = 'I am Lihua,I come from Beijing.I am amizing to seeing you!' #自定义字符串
pattern = re.compile('\w*a\w*') #利用compile方法编译一个pattern对象
#规则是多次寻找带a的单词
result = pattern.findall(str) #通过pattern对象来使用findall方法返回一个列表
print(result)
结果:
['am', 'Lihua', 'am', 'amizing']
- finditer 方法
- split 方法
- sub 方法
- subn 方法
#未完待续