1、正则表达式是用来干嘛的?
用来匹配字符串的 ,其中正则是意思是模糊匹配。
就其本质而言,正则表达式(或 RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。
字符匹配(普通字符,元字符):
1 普通字符:大多数字符和字母都会和自身匹配
>>> re.findall('alvin','yuanaleSxalexwupeiqi')
['alvin']
2 元字符:. ^ $ * + ? { } [ ] | ( ) \
元字符之. ^ $ * + ? { }
import re ret=re.findall('a..in','helloalvin') #一个点就代表一个字符 print(ret)#['alvin'] ret=re.findall('^a...n','alvinhelloawwwn') #只从开头开始匹配,如果开头没有,那么就会匹配到空字符 print(ret)#['alvin'] ret=re.findall('a...n$','alvinhelloawwwn') #只能从结尾开始匹配 print(ret)#['awwwn'] ret=re.findall('a...n$','alvinhelloawwwn') print(ret)#['awwwn'] ret=re.findall('abc*','abcccc')#贪婪匹配[0,+oo] #重复匹配 print(ret)#['abcccc'] ret=re.findall('abc+','abccc')#[1,+oo] print(ret)#['abccc'] ret=re.findall('abc?','abccc')#[0,1] print(ret)#['abc']
ret=re.findall('a?b','aaaabhghabfb')
print(ret)#['ab','ab','b'] ret=re.findall('abc{1,4}','abccc') print(ret)#['abccc'] 贪婪匹配 #{}里面的只表示范围,指定几次,什么都不加是{1,正无穷}
注意:前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配
ret=re.findall('abc*?','abcccccc') print(ret)#['ab']
元字符之字符集[]:
#--------------------------------------------字符集[] ret=re.findall('a[bc]d','acd') print(ret)#['acd'] #[]里面表示‘或’ ret=re.findall('[a-z]','acd') print(ret)#['a', 'c', 'd'] #表示a-z都可以 ret=re.findall('[.*+]','a.cd+') #[]字符集取消元字符的特殊功能,(\ ^ -)这三个例外。 print(ret)#['.', '+'] #在字符集里有功能的符号: - ^ \ ret=re.findall('[1-9]','45dha3') print(ret)#['4', '5', '3'] ret=re.findall('[^ab]','45bdha3') print(ret)#['4', '5', 'd', 'h', '3'] ^放在[]里面是表示取反的意思,非a和b ret=re.findall('[\d]','45bdha3') print(ret)#['4', '5', '3'] #\d 匹配任何十进制数;它相当于类 [0-9]。
元字符之转义符\
反斜杠后边跟元字符去除特殊功能,比如\.
反斜杠后边跟普通字符实现特殊功能,比如\d
\d 匹配任何十进制数;它相当于类 [0-9]。
\D 匹配任何非数字字符;它相当于类 [^0-9]。
\s 匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。
\S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。
\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]
\b 匹配一个特殊字符边界,比如空格 ,&,#等
ret=re.findall('I\b','I am LIST') print(ret)#[] ret=re.findall(r'I\b','I am LIST') print(ret)#['I'] 加一个“r”才表示/b是在re模块里的意思,不加就会默认在python里面的/b。所以前者是[]。
现在我们聊一聊\,先看下面两个匹配:
#-----------------------------eg1: import re ret=re.findall('c\l','abc\le') print(ret)#[] ret=re.findall('c\\l','abc\le') print(ret)#[] ret=re.findall('c\\\\l','abc\le') print(ret)#['c\\l'] ret=re.findall(r'c\\l','abc\le') print(ret)#['c\\l'] #-----------------------------eg2: #之所以选择\b是因为\b在ASCII表中是有意义的 m = re.findall('\bblow', 'blow') print(m) #[] m = re.findall(r'\bblow', 'blow') print(m) #['blow']
import re print(re.search('(as)+',"sdjkfasas").group()) #()作为一个整体,"+"表示对该整体进行重复匹配#asas print(re.search("(as)|3","as63wef").group()) #|表示或, #as print(re.search("3|(as)","as63wef").group()) #as print(re.search("3|(as)","36aswef").group()) #3 print(re.search("3|(as)","63aswef").group()) #3 #其意思是字符串从左到右先匹配到谁就是谁
re模块下的常用方法:
import re # # 1 # print(re.findall('a', 'alvin yuan')) # 返回所有满足匹配条件的结果,放在列表里 #['a', 'a'] # 2 print(re.search('a', 'alvin yuan').group()) # 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以 # 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。 #a # 3 print(re.match('a', 'abc').group()) # 同search,不过仅在字符串开始处进行匹配 #a # 4 ret = re.split('[ab]', 'abcd') # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割 print(ret) # ['', '', 'cd'] # 5 ret = re.sub('\d', 'abc', 'alvin5yuan6', 1) #re.sub(被替换的,替换后的,字符串,替换次数)sub就相当于replace print(ret) # alvinabcyuan6 ret = re.subn('\d', 'abc', 'alvin5yuan6') print(ret) # ('alvinabcyuanabc', 2) # 6 obj = re.compile('\d{3}') ret = obj.search('abc123eeee') print(ret.group()) # 123
注意:
import re ret=re.findall('www.(baidu|oldboy).com','www.oldboy.com') print(ret)#['oldboy'] 这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可 ret=re.findall('www.(?:baidu|oldboy).com','www.oldboy.com') print(ret)#['www.oldboy.com']
正则表达式的:
1、findall():所有结果都返回到一个列表里
2、search():返回匹配到的第一个对象(object),对象可以调用group方法返回结果。
3、match():只在字符串开始匹配
4、split()
import re ret=re.split("[j,s]","djksal")#先以j为分隔符,然后在j分完的基础上用s分隔符再分 print(ret) #['d', 'k', 'al']
import re ret=re.split("[j,s]","sdjksal")#先以j为分隔符,然后在j分完的基础上用s分隔符再分,即使s是开头,也会分出空格来 print(ret) #['', 'd', 'k', 'al']