Python3基础-正则表达式&re模块

正则表达式

定义:

即高级文本匹配模式,提供了搜索,替代等功能,本质是由一些字符和特殊符号组成的字串。这个字串描述了字符和字符的重复行为,可以匹配某一类特征的字符串集合。

re.findall(regex,string)

功能 : 使用正则表达式匹配字符串

参数 : regex : 正则表达式 

             string : 目标字符串
返回值 : 匹配到的内容

一 、元字符

(1) 普通字符

匹配规则 : 匹配相应的普通字符

data =re.findall('susu','hello, my name is susu\n')
print(data) #输出 ['susu']

(2)匹配单一字符 .
匹配规则: 匹配任意一个字符  '\n'除外

data =re.findall('susg','hello, my name is susu\n')
print(data) #输出 []

data =re.findall('s.s','hellomynameissusu\n')
print(data) #输出 ['sus']

data =re.findall('s..s','hellomynameissusu\n')
print(data) #输出 ['ssus']

data =re.findall('su','hellomynameissusu\n')
print(data) #输出 ['su', 'su']

(3)匹配字符串开头  ^   

data =re.findall('^h...o','hellomynameissusu')  #以h 开头
print(data) #输出 ['hello']

(4)匹配字符串结尾 $

data =re.findall('h...o$','hellomynameissusu')  #以o 结尾
print(data) #输出[]


data =re.findall('s...o$','hellomynameissusuo')  #以o 结尾
print(data) #输出['susuo']

(5)匹配重复0次或多次 *

data =re.findall('d*','hedllodmynddddddameissusud') #d 重复零次或更多次
print(data) #输出['', '', 'd', '', '', '', 'd', '', '', '', 'dddddd', '', '', '', '', '', '', '', '', '', 'd', '']

data =re.findall('my*','hedllodmynddddddameissusud') #y  重复零次或更多次
print(data) #输出 ['my', 'm']

(6)匹配重复1次或多次 +

data =re.findall('d+','hedllodmynddddddameissusud') #d  重复一次或者更多次
print(data) #输出['d', 'd', 'dddddd', 'd']

(7)匹配重复0次或1次 ?

data =re.findall('d?','hedllodmynddddddameissusud') #d  重复零次或者一次
print(data) #输出['', '', 'd', '', '', '', 'd', '', '', '', 'd', 'd', 'd', 'd', 'd', 'd', '', '', '', '', '', '', '', '', '', 'd', '']

data =re.findall('hed?','hedllodmynddddddameissusud') #d  重复零次或者一次
print(data) #输出['hed']

data =re.findall('su?','hedllodmyndudddddameissusud') #u 重复零次或者一次
print(data) #输出['s', 'su', 'su']

(8)匹配重复指定次数{N}

data =re.findall('su{1}','hedllodmynduddddsuudameissusud') #u 重复一次
print(data) #输出['su', 'su', 'su']

data =re.findall('su{2}','hedllodmynduddddsuudameissusud') #u 重复两次
print(data) #输出['suu']

(9)匹配重复指定次数范围{N,} {N,M}

data =re.findall('su{1,}','hedllodmynduddddsuudameissusud') #u 重复1次或者更多次
print(data) #输出['suu', 'su', 'su']

data =re.findall('su{1,}','hedllodmynduddddsuudameissusud') #u 重复1次或者更多次
print(data) #输出['suu', 'su', 'su']

data =re.findall('su{2,3}','hedllodmynduddddsuudameissusud') #u 重复2次或者3次
print(data) #输出['suu']

(10)字符集匹配 [ ]

元字符 : [abcd]
匹配规则 : 匹配中括号中的字符集区间 的一个字符

data=re.findall("www[oldbog baidu]","wwwbaidu")
print(data) #输出['wwwb']
data=re.findall("www[baidu]","wwwbaidu")
print(data) #输出['wwwb']
data=re.findall("www[baidu]","wwwbaiduwwwaibu")
print(data) #输出['wwwb', 'wwwa']
data=re.findall("www[baidu]","sddwww")
print(data) #输出[]
data=re.findall("w[a-z]","wu")  #a-z 任意字母
print(data) #输出['wu']
data=re.findall("w[a-zA-Z]","wuwO")  #a-z 任意字母  A-Z任意字母
print(data) #['wu', 'wO']
data=re.findall("w[a-z]*","wu")  #a-z 任意字母
print(data) #输出['wu']
data=re.findall("w[a-z]*","wue")  #a-z 任意字母
print(data) #输出['wu']
data=re.findall("w[a-z]*","wuddddasdwqeqweqwee")  #a-z 任意字母
print(data) #输出['wuddddasdwqeqweqwee']
data=re.findall("w[a-z]*","wudd9")  #a-z 任意字母
print(data) #输出['wudd']
data=re.findall("w[0-9]*","wudd9")  #a-z 任意字母
print(data) #输出['w']

(11)字符集不匹配 
元字符 :  [^ abc]
匹配规则 : 不匹配出字符集中字符的任意一个字符

data=re.findall("[^abcd]","abcdefghijk")
print(data) #输出['e', 'f', 'g', 'h', 'i', 'j', 'k']

data=re.findall("w[^abcd]","wabcdefghijk")
print(data) #输出[]

data=re.findall("w[^abcd]","wefghijk")
print(data) #输出['we']

(12)匹配任意数字(非数字)字符
元字符 : \d    [0-9]     \D   [^0-9]
匹配规则: \d 匹配任意一个数字字符    \D 匹配任意非数字字符

data =re.findall('\d+','susu12sugh12haiyun38dddss60') # 匹配数字 重复一次或者更多次
print(data) #输出['12', '12', '38', '60']

data =re.findall('\D+','susu12sugh12haiyun38dddss60') # 匹配非数字 重复一次或者更多次
print(data) #输出['susu', 'sugh', 'haiyun', 'dddss']

(13)匹配任意普通字符(特殊字符)
元字符 : \w  [_0-9a-zA-Z]   \W  [^_0-9a-zA-Z]
匹配规则 : \w 匹配数字字母下划线   \W 除了数字字母下划线

data =re.findall('\w+','susu12###~su_gh12###@@!haiyun38###%^&*dddss60()()苏苏88') #匹配字母或者数字或者下划线或者汉字  重复一次或者更多次
print(data) #输出['susu12', 'su_gh12', 'haiyun38', 'dddss60', '苏苏88']

data =re.findall('\W+','susu12###~su_gh12###@@!haiyun38###%^&*dddss60()()苏苏88') #匹配非字母或者数字或者下划线或者汉字  重复一次或者更多次
print(data) #输出['###~', '###@@!', '###%^&*', '()()']

(14)匹配任意 (非)空字符
元字符 : \s   \S
匹配规则:  \s  任意空字符  [ \n\0\t\r]  空格 换行  回车 制表
            \S  任意非空字符

data =re.findall('\s+','susu12 sugh12  haiyun38      dddss60') # 匹配任意的空白符 重复一次或者更多次
print(data) #输出[' ', '  ', '      ']

data =re.findall('\S+','susu12 sugh12  haiyun38      dddss60') # 匹配任意的非空白符 重复一次或者更多次
print(data) #输出['susu12', 'sugh12', 'haiyun38', 'dddss60']

(15)匹配字符串开头结尾

元字符 : \A  ^    \Z  $
匹配规则: \A 表示匹配字符串开头位置 
           \Z  表示匹配字符串的结尾位置

data =re.findall('\Ahai','susu12 sugh12  haiyun38      dddss60')
print(data) #输出[]

data =re.findall('\As','susu12 sugh12  haiyun38      dddss60')
print(data) #输出['s']

data =re.findall('60\Z','susu12 sugh12  haiyun38      dddss60')
print(data) #输出['60']

data =re.findall('\Ahello\Z','hello')
print(data) #输出['hello']

data =re.findall('\Ahello\Z','helElo')
print(data) #输出[]

(16)使用 或 多个正则  或者匹配
元字符 : | 
匹配规则:匹配A或B

data =re.findall('ab|af','abdddddaf')
print(data) #输出['ab', 'af']

data =re.findall('ab| af','abdddddaf')
print(data) #输出['ab']

data =re.findall(' ab| af','abdddddaf')
print(data) #输出[]

data =re.findall('ab|ag','abdddddaf')
print(data) #输出['ab']

(17)匹配(非)单词边界 
元字符:  \b    \B 
匹配规则  \b  匹配一个单词的边界
          \B  匹配一个单词的非边界
            数字字母下划线和其他字符的交界处认为是单词边界

data =re.findall('is','My name is liis')
print(data) #输出['is', 'is']

data =re.findall('\bis\b','My name is liis')
print(data) #输出[]

data =re.findall('\\bis\\b','My name is liis')
print(data) #输出['is']


data =re.findall(r'\bis\b','My name is liis') # r 表示原生字符串  匹配一个数字的"\\d"可以写成r"\d"
print(data) #输出['is']
注意:
\b的两种解释是:

'\b', 如果前面不加r, 那么解释器认为是转义字符“退格键backspace”;

r'\b', 如果前面加r, 那么解释器不会进行转义,\b 解释为正则表达式模式中的字符串边界。

而相比于\b, \w 只有第二种解释,并没有对应的转义字符,所以不加r, 也不会出错。  
data =re.findall('a..x','a..x')
print(data) #输出['a..x']
data =re.findall('a..x$','a..x$')
print(data) #输出[]
data =re.findall('a..x\$','a..x$')
print(data) #输出 ['a..x$']

使用()为正则表达式分组
((ab)cd(ef))  : 表示给ab分了一个子组

obj = re.compile('abc')
print(obj.findall('abcdefj'))

data=re.findall('(ab)cd(ef)','abcdef')
print(data) #输出[('ab', 'ef')]

data=re.findall('(ab)cd(ef)','abdcef')
print(data) #输出[]

data=re.findall('((ab)cd(ef))','abcdef')
print(data) #输出[('abcdef', 'ab', 'ef')]

data=re.findall('(ab)dcef','abdcefyyyy')
print(data) #输出['ab']
data=re.findall('(?:ab)dcef','abdcefyyyy')
print(data) #['abdcef']
data=re.findall('(ab)dc(ef)','abdcefyyyy')
print(data) #[('ab', 'ef')]
data=re.findall('(?:ab)dc(ef)','abdcefyyyy')
print(data) #['ef']
data=re.findall('(ab)dc(?:ef)','abdcefyyyy')
print(data) #['ab']
data=re.findall('(?:ab)dc(?:ef)','abdcefyyyy')
print(data) #['abdcef']
>>> re.findall(r"(abc)+", "abcabcabc")  # 想要匹配多个"abc",使用分组时会优先把分组的内容返回
['abc']
>>> re.findall(r"(?:abc)+", "abcabcabc")  # 想要匹配多个"abc",(?:)把分组去掉,变成一个普通的字符串
['abcabcabc']
data=re.findall(r'^(\d{3})-(\d{3,8})$', '010-12345')
print(data) #输出的是 [('010', '12345')]
data=re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
print(data.group(0))  #group()  同 group(0) 就是匹配正则表达式整体结果
print(data.group())  #===group(0)   
print(data.group(1)) # 输出 010
print(data.group(2))  #输出  12345
print(data.groups())  #输出 ('010', '12345')
data=re.match('(?P<word>[a-z]+)', 'susu12sddd22sudd23').group()
print(data) #输出 susu
data=re.match('(?P<word>[a-z]+)\d+', 'susu12sddd22sudd23').group()
print(data) #输出 susu12
data=re.match('(?P<word>[a-z]+)\d+', 'susu12sddd22sudd23').group('word')
print(data) #输出 susu
data=re.match('(?P<word>[a-z]+)(?P<age>\d+)', 'susu12sddd22sudd23').group()
print(data) #输出  susu12
data=re.match('(?P<word>[a-z]+)(?P<age>\d+)', 'susu12sddd22sudd23').group('age')
print(data) #输出  12
data=re.match('(?P<word>[a-z]+)(?P<age>\d+)', 'susu12sddd22sudd23').group('word')
print(data) #输出  susu
data=re.match('(?P<word>[a-z]+)(?P<age>\d+)', 'susu12sddd22sudd23').groups()
print(data) #输出  ('susu', '12')
data=re.match('(?P<word>[a-z]+)', 'susu12sddd22sudd23')
print(data.groups()) #输出('susu',)
 group()  同 group(0) 就是匹配正则表达式整体结果
 group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。
 group(num=0)    匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups()    返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

二、re模块

compile(pattern, flags=0)
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象

obj = re.compile('abc')
print(obj.findall('abcdefj'))

findall(string,pos ,endpos)
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

data =re.findall('myabc','myabc hahhhh  myabc')
print(data) #输出['myabc', 'myabc']

obj = re.compile('abc')
print(obj.findall('abcdefj',pos= 0,endpos=7))  #['abc']

obj = re.compile('abc')
print(obj.findall('abcdefj',pos= 1,endpos=7))  #输出[]

split 方法按照能够匹配的子串将字符串分割后返回列表

data =  re.split('\s+','hello python')
print(data)  #输出['hello', 'python']

sub(pattern,re_string,string,count)
功能:用目标字符串替换正则表达式匹配内容
参数:re_string  用什么来替换
      string    要匹配的目标字符串
      count     最多替换几处
返回值 : 返回替换后的字符串 

subn()
返回值 : 比sub多一个实际替换的个数

data =  re.sub('\d+','++','susu20sugh19myd30yunxi2')
print(data)  #输出 susu++sugh++myd++yunxi++


data =  re.subn('\d+','++','susu20sugh19myd30yunxi2')
print(data)  #输出 ('susu++sugh++myd++yunxi++', 4)

match():尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。

import  re

print(re.match('www','www.siit.com').span()) #起始位置匹配
print(re.match('com','www.siit.com'))        #不在起始位置

"""
执行结果
(0, 3)
None
"""

re.search 扫描整个字符串并返回第一个成功的匹配。

import  re

print(re.search('www','www.siit.com').span()) #起始位置匹配
print(re.search('com','www.siit.com').span()) #不在起始位置
"""
执行结果
(0, 3)
(9, 12)
"""

 

posted @ 2019-10-31 14:36  槑槑DE  阅读(185)  评论(0编辑  收藏  举报