2021-06-15 Python基础知识——正则表达式

目录

一、正则表达式的概述:英文名为 Regular Expression,又称规则表达式。正则表达式常被用来检索、替换符合某些规则的文本内容。其离不开re模块。

二、re模块以及部分方法示例

# re.match 方法

re.match方法关于标志位

#group(num)或者 groups()

三、关于正则表达式的规则

四、正则表达式——懒惰与贪婪模式

#正则表达式前面加个r,则原生的字符串不会出现转义现象​​​​​​

#匹配开头 ^  和结尾 $

五、分组匹配

六、re.compile方法


一、正则表达式的概述:英文名为 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 方法

#未完待续

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值