1、原子概念:
原子是正则表达式中最基本的组成单位,每个正则表达式至少包含一个原子
常见原子类型:
普通字符,如a b c等
非打印字符,如 等
通用字符,如d, D等
常用的通用字符:
字符 | 说明 |
d | 匹配一个数字字符,等价于[0-9] |
D | 匹配一个非数字字符,等价于[^0-9] |
s | 匹配任何空白字符,包括空白,制表符,换行符等等, 等价于[f v] |
S | 匹配任何非空白字符 |
w | 匹配字母,数字,下划线,等价于[a-zA-Z0-9_] |
W | 匹配非字母,非数字,非下划线 |
2、元字符,就是正则表达式中具有一些特殊含义的字符
常见的元字符有:
字符 | 描述 |
. |
匹配除了 之外的任何字符 要匹配 在内的字符,需要使用.| |
[xyz] | 字符集合,匹配所包含的任意一个字符 |
[^xyz] | 负值字符集合,匹配未包含的任意一个字符 |
[a-z] | 匹配指定范围内的任意一个字符 |
* | 匹配前面的子表达式 0 次或 多 次,如zo* 可以匹配z,zo,zoo等 |
+ | 匹配前面的子表达式 1 次或 多 次,如zo+可以匹配zo,zoo但是不能匹配z |
? | 匹配前面的子表达式 0 次或 1 次, 如zo?可以匹配z,zo不能匹配zoo |
{n} | n是一个非负整数,匹配确定的n次 |
{n,} | 至少匹配n次,o{0,}等价于o*, o{1,}等价于o+,o{0,1}等价于o? |
{n,m} | 最小匹配n次,最多匹配m次, |
将下一个字符标记为特殊字符,或一个原义字符,或一个向后引用,或一个八进制转义符 | |
^ | 匹配字符串的开始位置,如果设置了RegExp对象的Multiline属性, ^也匹配 或 之后的位置 |
$ | 匹配字符串的结束位置,如果设置了RegExp对象的Multiline属性,^也匹配 或 之前的位置 |
? |
如果是跟在其他任何一个限制符后面(*,+,?,{n},{n,m}等),匹配模式将变成非贪婪模式 非贪婪模式尽可能少的匹配所搜索的字符串,而贪婪模式尽可能多的匹配所搜索的字符串 如"oooo"中,o+将匹配所有o,o+?将只匹配一个o |
x|y | 匹配x或y |
3、模式修正符
在不改变正则表达式的情况下,通过模式修正符改变正则表达式的意义,从而实现一些匹配结果的调整
修饰符 | 描述 |
re.I | 使匹配对大小写不敏感 |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.L | 做本地化识别匹配 |
re.M | 多行匹配,影响^和$ |
re.U | 根据Unicode字符集解析字符 |
4、re模块
python中,通过re模块来实现正则匹配
re模块中常用的功能函数:
1)compile()
编译正则表达式模式,返回一个正则对象(可以把常用的正则表达式编译成正则表达式对象,这样可以提高效率)
re.compile(pattern[, flags=0])
pattern:编译时用的表达式字符串
flags:编译标志位,用于修改正则表达式的匹配方式,如re.I 不区分大小写,re.S等
import re
tt = "Tina is a good girl, she is cool, clever..."
pattern = r"w*oow*" # 查找包含oo的单词
reg = re.compile(pattern)
reg.findall(tt) # ['good', 'cool']
2)match()
决定re是否在字符串开头位置匹配
re.match(pattern, string[, flags])
print(re.match("www", "www.baidu.com").group) # www
print(re.match("www", "WWW.BAIDU.COM", re.I).group()) #WWW
3)search()
re.search(pattern, string[, flags])
search()会在字符串内查找匹配,如果找到第一个匹配的,就返回,如果没有找到就返回None
match和search一旦匹配成功,就是一个match object对象,match object对象有以下方法:
group():返回被re匹配的字符串
start():返回匹配开始的位置
end():返回匹配结束的位置
span():返回一个包含开始,结束位置的元组
4)findall()
遍历查找所有匹配的元素,以列表形式返回
re.findall(pattern, string[, flag])
5)finditer()
re.finditer(pattern, string[, flags])
搜索string,找到re匹配的所有的子串,并把它们作为迭代器返回,返回的结果是由所有匹配的match对象组成的迭代器
6)split()
按照能够匹配的子串将string分割后,返回的列表
re.split(pattern, string[, flag])
如下,按照空白字符分割字符串,返回列表
按数字分割字符串,返回列表
7)sub()
re.sub(pattern, rep1, string, count)
pattern:匹配的正则表达式
rep1:替换的新的字符串
string:原始字符串
count:指定替换次数,默认为0,表示都替换。
sub() 还允许使用函数对匹配项进行复杂的处理,如下,把字符串中所有数字替换后(数字+1)
8)subn()
返回替换后的结果和替换的次数,以元组形式返回
re.subn(pattern, rep1, string ,count=0, flags)
5、re模块中re.match(), re.search(), re.findall()的区别
re.match()只在字符串开始位置进行匹配,如果不匹配就返回None
re.search()遍历整个字符串,找到第一个匹配项就返回
re.findall()遍历整个字符串,找到所有的匹配项并以列表形式返回