1.正则表达式库文件:import re
2.正则表达式常用符号
. :匹配任意字符,'
'除外
a = 'zjw1324399' b = re.findall('z.',a) '''点号就相当于一个占位符''' print(b) Console: zj
* :匹配前一个字符0次或无限次
a = 'zzzjw1324399' b = re.findall('z*',a) print(b) Console: ['zzz', '', '', '', '', '', '', '', '', '', '']
? : 匹配前一个字符0次或一次
a = 'zzzjw1324399' b = re.findall('z?',a) print(b) Console: ['z', 'z', 'z', '', '', '', '', '', '', '', '', '', '']
.* : 贪心算法
a = 'qwerxxixxxxlovexxxxyouxxabcd' b = re.findall('xx.*xx',a) print(b) Console: ['xxixxxxlovexxxxyouxx']
.*?: 非贪心算法
a = 'qwerxxixxxxlovexxxxyouxxabcd' b = re.findall('xx.*?xx',a) print(b) Console: ['xxixx', 'xxlovexx', 'xxyouxx']
() :括号内的数据作为结果返回
a = 'qwerxxixxxxlovexxxxyouxxabcd' b = re.findall('xx(.*?)xx',a) print(b) for every in b: print(every) Console: ['i', 'love', 'you'] i love you
d+ :匹配纯数字
a = '''12345shangshandalaohu56789laohumeidadao''' b = re.findall('(d+)',a) print(b) Console: ['12345', '56789']
然而值得注意的是以xx作为搜索符号,则所有的字符都必须有自己的搜索符,已经被检索过的搜索符并不算在下一个检索范围内
如:
a = 'qwerxxixxlovexxyouxxabcd' b = re.findall('xx(.*?)xx',a) '''love两旁的xx分别是i和you的后缀和前驱,故love并没有被检索到''' print(b) Console: ['i', 'you']
若字符存在换行符,如:
a = '''qwerxxi xxabcdxxlovexxabcdxxyouxxabcd''' b = re.findall('xx(.*?)xx',a) print(b) Console: ['abcd', 'abcd']
若想忽略换行符的,看整体的字符串则需要方法re.S(使 . 的作用域包含 )
a = '''qwerxxi xxabcdxxlovexxabcdxxyouxxabcd''' b = re.findall('xx(.*?)xx',a,re.S) print(b) Console: ['i ', 'love', 'you']
3.正则表达式常用方法
findall :匹配所有符合规律的内容
Search :匹配并提取第一个符合规律的内容返回第一个正则表达式对象
a = '''qwerxxixxabcdxxlovexxabcdxxyouxxabcd''' b = re.search('xx(.*?)xxabcdxx(.*?)xx',a).group(1) c = re.findall('xx(.*?)xxabcdxx(.*?)xx',a) print(b) print(c[0][1]) '''0代表第一种相似的情况,1等同于.group(2)''' Console: i love
a = '''qwerxxixxabcdxxlovexxabcdxxyouxxabcd''' b = re.search('xx(.*?)xxabcdxx(.*?)xx',a).group(2)
'''group(3)会报错,因为group(n)代表匹配的括号数n''' print(b) Console: love
Sub :替换符合规律的内容,返回替换后的值
a = '''iloveyou''' hate = 'hate' b = re.sub('i(.*?)you','i%syou'%hate,a) '''%s可替换为%d代表int类型,可直接写数字''' print(b) Console: ihateyou