《Python从小白到大牛》学习笔记基础部分-第四篇

"""
正则表达式:
预先定义好的一个‘规则字符串’,用该规则字符串进行匹配、查找和替换那些符合‘规则’的文本。
用于文本匹配、查找和替换的模块re。
正则表达式:普通字符和元字符。
元字符是预先定义好的一些特定字符。
\ 转义符 . 表示任意一个字符 + 表示重复一次或多次 * 表示重复零次或多次 ? 表示重复零次或一次 | 表示或 {} 定义量词 []定义字符类 ()定义分组 
^可以表示取反或匹配一行的开始 $匹配一行的结束

字符转义\可以对普通字符转义或者对元字符进行转义

预定义字符类:
. 匹配任意一个字符 \\匹配反斜杠 \n匹配换行 \r匹配回车 \f匹配换页符 \t匹配水平制表符 \v匹配垂直制表符 \s匹配一个空格符【等价于\t\n\r\f\v】 
\S匹配一个非空格符【类似于^\s】 \d匹配一个数字字符【0-9】 \D匹配一个非数字字符【^0-9】 
\w匹配任何语言的单词字符(英文字母、亚洲文字)、数字和下划线等,如果是正则表达式编译标志设置为ASCII,则只匹配[a-zA-Z0-9] \W等价于[^\w]

re.search()函数在字符串text中查找匹配p1正则表达式,如果找到第一个则返回match对象,如果没有找到则返回None。

字符类,一个字符类定义一组字符,其中的任一字符出现在输入字符串中即匹配成功。注意每次匹配只能匹配字符类中的一个字符。
[Jj]ava 可以匹配Java或者java
字符类取反,类中取反p = r'[^0123456789]'   只会匹配类中的一个字符。
对于类中的连续区间[0-9]可以如此[a-z],[A-Z].
[0-25-7] 表示0,1,2,5,6,7

量词表示字符或者字符串重复的次数,{n} 出现n次,量词表示次数,{n,m} n-m次, {n,}至少n次 

贪婪量词会尽可能多地匹配,懒惰量词则会尽可能地少地匹配,默认是贪婪量词{8,9}会匹配9次,{8,9}?则会尽可能地匹配少的,8次。

分组:对一个字符串整体使用量词,例如:p = r'(121){2}'  表示121会出现2次。

分组命名:组命名通过在组开头添加“?P<分组名>”

反向引用分组\组编号 组编号是从1开始的。

非捕获分组:捕获结果可以通过组编号或者组名进行引用,但是有时并不想引用子表达式的匹配结果,不想捕获匹配结果,只是将小括号作为一个整体进行匹配,此时可以使用非捕获分组
在组的开头使用“?:”可以实现非捕获分组。

re模块:
search()和match()函数:
search():在输入字符串中查找,返回第一个匹配内容,如果找到则match()对象,如果没有找到则返回None
match():在输入字符串开始处查找匹配内容,如果找到一个则match对象,如果没有找到则返回None

match对象的几个方法:
m.group()   返回匹配的字符串
m.start()   返回开始字符串的下标
m.end()     返回结束字符串的下标
m.span()    返回字符串的下标区间

findall()和finditer()函数:
findall():如果匹配成功则返回match列表对象
finditer():如果匹配成功,则返回容纳match的可迭代对象,通过迭代对象每次可以返回一个match对象,如果匹配失败则会返回None



"""
import re

p1 = r'\w+@zhijieketang\.com'
p2 = r'^\w+@zhijieketang\.com$'

text = "Tony's email is tony_guan588@zhijieketang.com"
m = re.search(p1, text)  #查看text中是否有匹配的字符串
print(m)                 #<_sre.SRE_Match object; span=(16, 45), match='tony_guan588@zhijieketang.com'>
m = re.search(p2, text)
print(m)     #增加了开头和结束,因此不匹配   返回None
email = 'tony_guan588@zhijieketang.com'
m = re.search(p2, email)
print(m)

p = r'[Jj]ava'
m = re.search(p, 'I like Java and Python.')
print(m)   #匹配Java或者java      因为没有分组所以只返回匹配结果

p = r'(121){2}'

m = re.search(p, '121121abcabc')
print(m)
print(m.group())     #m.group()函数会返回匹配的字符串
print(m.group(1))    #m.group(1)则只会返回一组        在匹配的字符串中,第一个的下标为1

p = r'(\d{3,4})-(\d{7,8})'
m = re.search(p, '010-87654321')
print(m)
print(m.group())    #返回匹配的字符串
print(m.groups())   #获得所有组匹配的字符串

p = r'(?P<area_code>\d{3,4})-(?P<phone_code>\d{7,8})'
m = re.search(p, '010-87654321')
print(m)
print(m.group('area_code'))
print(m.group('phone_code'))   #通过组名来进行调用,也可以通过编号,第一个编号为1.

#反向引用分组
#匹配XML标签
p = r'<([\w]+)>.*</\1>'   #使用反向引用
m = re.search(p, '<a>abc</a>')
print(m)
print(m.groups())

#非捕获分组的使用
s = 'img1.jpg,img2.jpg,img3.bmp'

p = r'\w+(\.jpg)'    #捕获分组
m = re.findall(p, s)
print(m)         #匹配结果分组

p = r'\w+(?:\.jpg)'
m = re.findall(p, s)    #非捕获分组
print(m)       #因为是非捕获分组所以不能使用groups()函数

#非捕获分组将括号中的内容作为普通的正则表达式字符串进行整体匹配。

#findall和finditem函数
p = r'[Jj]ava'
text = 'I like Java and java.'

match_list = re.findall(p, text)
print(match_list)

match_item = re.finditer(p, text)
for m in match_item:        #使用for语句来遍历可迭代对象
    print(m.group())

"""
re模块
字符串分割:split()
re.split(pattern, string, maxsplit=0, flags=0)
返回分割后的字符串列表对象
pattern是正则表达式,string是要分割的字符串,参数maxsplit是最大分割次数,maxsplit默认值为0,表示分割次数没有限制,参数flags是编译标志。

字符串替换:sub(),该函数用于替换匹配的子字符串,返回值是替换后的字符串。
re.sub(pattern, rep1, string, count=0, flags=0)   
pattern是正则表达式,参数rep1是替换字符串,string是要提供的字符串,count是要替换的最大数量,默认值是0表示替换没有限制,flag是编译标志

编译正则表达式:compile()
re.compile(pattern[, flags=0])
pattern是正则表达式,参数flags是编译标志。compile()函数返回一个编译的正则表达式对象regex
该对象也提供文本的匹配、查找和替换等操作方法。
regex.search() regex.match() regex.findall() regex.finditem() regex.split() regex.sub()

编译标志:
例如编码:python2中是ASCII编码,python3中是Unicode编码,可以设置re.A,或者re.U设置采用的编码方式。
re.compile(p, re.A)
re.I  忽略大小写

有时需要‘.’能够匹配换行符,此时可以设置re.S re.DOTALL
多行模式:re.M 多行模式对 ^ $有影响,原本是匹配开始和结束,现在是匹配每行的开始和结束
详细模式:re.X  详细模式下可以在正则表达式中添加注释,可以有空格和换行,这样编写正则表达式便于阅读。

设置多个编译标志时中间要用位或 |  re.I | re.X
"""
p = r'\d+'
text = 'AB12CD34EF'
clist = re.split(p, text)
print(clist)    #是以p作为分割符号进行分割

clist = re.split(p, text, maxsplit= 1)
print(clist)

repace_text = re.sub(p, ' ', text)
print(repace_text)

p = r'\w+@zhijieketang\.com'
regex = re.compile(p)

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

#使用编译对象更方便以及更快
m = regex.search(text)
print(m)

#详细模式
p = """(java)         #匹配java字符串
        .*            #匹配任意字符零或多个
        (python)      #匹配python字符串
    """
regex = re.compile(p, re.I | re.X)

m = regex.search('I like Java and Python.')
print(m)       #.* 相当于匹配任意的一串字符    并不是匹配重复的一串字符

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值