Python 正则介绍

正则表达式是一种小型的,高度专业化的变成语言,在 Python 中,它通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的引擎执行。

findall() 方法,所有匹配的结果都返回到一个列表里

import re

res = re.findall('klvchen', 'hello ,My name is klvchen. Are you ok?')
print(res)
运行结果:
['klvchen']

原字符: . ^ $ * + ? { } [ ] | ( ) \

. 只能代指任意一个字符

import re

res = re.findall('w..l', 'hello world')
print(res)
运行结果:
['worl'] res = re.findall('w..l', 'hello w\t ld')
print(res)
运行结果:
['w\t l'] # \t 空格也是属于一个字符

^ 以后面一个字符开头

import re

res = re.findall('^h...o ', 'hello world')
print(res)
运行结果:
['hello']

$ 以前面一个字符结尾

import re

res = re.findall('wo..d$', 'hello,world')
print(res)
运行结果:
['world']

* 重复匹配前面一个字符 (0个或多个), 默认是贪婪匹配

import re

res = re.findall('ba*', 'urtslkfslabaaaa')
print(res)
运行结果:
['baaaa'] res = re.findall('ba*?', 'urtslkfslabaaaa') # 后面加 ? 号使其变成惰性匹配
print(res)
运行结果:
['b']

+ 重复匹配前面一个字符(1个或多个), 默认是贪婪匹配

import re

res = re.findall('a+b', 'urtslkfslabaaaa')
print(res)
运行结果:
['ab']

? 重复匹配前面一个字符(0个或1个)

import re

res = re.findall('a?b', 'urtblkfslabaaaa')
print(res)
运行结果:
['b', 'ab']

{n, m} 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式

import re

res = re.findall('a{3}', 'aaab')
print(res)
运行结果:
['aaa'] res = re.findall('a{1,2}', 'aaab')
print(res)
运行结果:
['aa', 'a']

[] 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k', 取消元字符的特殊功能

import re

res = re.findall('a[b,c]d', 'acd')
print(res)
运行结果:
['acd'] res = re.findall('[a-zA-Z]', 'acd')
print(res)
运行结果:
['a', 'c', 'd'] res = re.findall('[w,*]', 'klwdx*')
print(res)
运行结果:
['w', '*'] res = re.findall('[w,,]', 'klwdx*,')
print(res)
运行结果:
['w', ','] res = re.findall('[1-9]', 'hsdl1dsfsf56')
print(res)
运行结果:
['1', '5', '6'] res = re.findall('[1-9,a-z,A-Z]','12klvCHEN')
print(res)
运行结果:
['1', '2', 'k', 'l', 'v', 'C', 'H', 'E', 'N']

^ 在 [] 里,取反

import re

res = re.findall('[^1,2]','h1w 2')
print(res)
运行结果:
['h', 'w', ' ']

() 代表着一个整体

import re

res = re.findall('www.(\w+).com','www.baidu.com')   #返回()的内容
print(res)
运行结果:
['baidu'] res = re.findall('www.(?:\w+).com','www.baidu.com') #返回整体
print(res)
运行结果:
['www.baidu.com']
模式 说明
\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 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
import re

res = re.findall('\d{11}', 'abcd123456789098765')
print(res)
运行结果:
['12345678909'] res = re.findall('\sabc', 'hello abc')
print(res)
运行结果:
[' abc'] res = re.findall('\w', 'he llo')
print(res)
运行结果:
['h', 'e', 'l', 'l', 'o'] res = re.findall(r'I\b', 'hello,I am klvchen')
print(res)
运行结果:
['I'] res = re.findall(r'\\','ab\cde')
print(res)
运行结果:
['\\']

search 方法,返回匹配到的第一个对象(object), 需要调用group()返回结果

import re

res = re.search('kl', 'hello, my name is klvchen')
print(res)
print(res.group())
运行结果:
<_sre.SRE_Match object; span=(18, 20), match='kl'>
kl res = re.search('a\.', 'a.jpg').group()
print(res)
运行结果:
a. res = re.search('(as)+','sdfsafasksas').group()
print(res)
运行结果:
as res = re.search('(as)|3','abas8as').group()
print(res)
运行结果:
as res = re.search('(?P<id>\d{4})','hello,12345678') #(?P<名字>正则)这是固定格式,然后可以通过名字调用
print(res.group('id'))
运行结果:
1234 res = re.search('(?P<id>\d{4})/(?P<name>\w{2})','hello,12345678/klvchen')
print(res.group('id'))
print(res.group('name'))
运行结果:
5678
kl

match() 方法,仅在字符串开始的地方匹配,返回匹配到的第一个对象(object), 需要调用group()返回结果

import re

res = re.match('abc','aabcdabc')
print(res)
运行结果:
None res = re.match('abc','abcdabc')
print(res.group())
运行结果:
abc

split() 方法

import re
res = re.split('[b,f]','abcdefghij') # 先切割 b ,再对剩下的字符串以 f 进行切割
print(res)
运行结果:
['a', 'cde', 'ghij']

sub() 方法

import re
res = re.sub('k.v','abc','klvchen')
print(res)
运行结果:
abcchen res = re.sub('\d','8','k1v2chen',1) # 只替换一次
print(res)
运行结果:
k8v2chen

compile() 方法

obj = re.compile('\.com')
res = obj.findall('ab.comdefg')
print(res)
运行结果:
['.com']

finditer() 方法

res = re.finditer('\d', 'ab3cd4gh5jk')
print(res)
print(next(res).group())
print(next(res).group())
运行结果:
<callable_iterator object at 0x0000013DFF84CD30>
3
4
上一篇:Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案


下一篇:MyBatis中Like语句使用总结