一、正则表达式
正则表达式产生原因:
1. 文本处理已经成为计算机常见工作之一
2. 对文本内容的搜索、定位、提取是一项比较复杂困难的工作
3. 为了快速方便处理上述问题,产生正则表达式技术
定义:
即高级文本匹配模式,提供了搜索、替代、查找等功能。本质是由一系列特殊符号和字符组成的子串,这个子串即是正则表达式。这个表达式描述了字符和字符的重复行为,可以匹配一类特征的字符串。
目标:
1. 熟练使用正则表达式符号
2. 正确组合和理解一般的正则表达式
3. 能够使用Python操作正则表达式
正则表达式特点
* 方便进行检索和修改文本的操作
* 支持语言众多
* 灵活多样
* mongo正则类型,django等框架作为url匹配,爬虫
正则表达式的使用
Python ----》 re模块 处理正则表达式
re.findall(pattern,string)
功能:使用正则表达式匹配字符串
参数:pattern 正则表达式
string 目标字符串
返回值:一个列表 匹配到的所有内容
二、元字符
即正则表达式中有特殊含义的符号
元字符总结
匹配单个字符:a . \d \D \w \W \s \S [...] [^...]
匹配重复性 : * + ? {N} {m,n}
匹配某个位置 : ^ $ \A \Z \b \B
其他 : | () \
名字 | 字符 | 匹配规则 | 示例 | 结果 |
普通字符 | a b c & # | 匹配相应的普通字符 | re.findall("abc","abcdefghabcdhig") | ['abc', 'abc'] |
或 | | |
匹配|两边任意一个正则表达式符合的情况 注: |两侧不要有没用的空格 |
re.findall("ab|cd","abcdefghabcdhig") | ['ab', 'cd', 'ab', 'cd'] |
匹配单一字符 | . | 匹配除了换行(\n)之外的任意字符 | re.findall("f.o","foo is not fao") | ['foo', 'fao'] |
匹配开始位置 | ^ | 匹配一个字符串的开始位置 | re.findall("^hello","hello world") | ['hello'] |
匹配结束位置 | $ | 匹配目标字符串的结束位置 | re.findall("py$","hello.py") | ['py'] |
匹配起止位置 | \A(^) \Z($) | \A匹配开始位置 \Z匹配结束位置 | re.findall("\A/\w+/\w+\Z",'/football/zhongchao') | ['/football/zhongchao'] |
匹配重复 | * | 匹配前面的正则表达式重复0次或多次 | re.findall("ab*","abbcdef") | ['abb'] |
匹配重复 | + | 匹配前面的正则表达式重复1次或多次 | re.findall(".+py$","hello.py") | ['hello.py'] |
匹配重复 | ? | 匹配前面的正则表达式重复0次或1次 | re.findall("ab?","abcdefa") | ['ab', 'a'] |
匹配重复 | {n} | 匹配指定的重复次数 | re.findall("ab{3}","abbbbbbbb") | ['abbb'] |
匹配重复 | {m,n} | 匹配前面的正则表达式重复m次到n次 | re.findall("ab{2,5}","abcdabbbabbbbbb") | ['abbb', 'abbbbb'] |
匹配字符集合 | [] |
匹配括号范围内的任意一个字符 [abc123d] a b c 1 2 3 d |
re.findall("[_0-9a-zA-Z]","Hello world 123") | |
匹配字符集合 | [^...] | 匹配除了字符集中的任意一个字符 | re.findall('[^abce]+',"a little boy") | [' littl', ' ', 'oy'] |
匹配任意(非)数字字符 | \d \D |
\d 匹配任意数字字符:[0-9] \D 匹配任意非数字字符:[^0-9] |
re.findall("1\d{10}","17611665537") | ['17611665537'] |
匹配(非)普通字符 | \w \W |
普通字符: 数字、字母、下划线 \w 匹配任意一个普通字符:[_0-9a-zA-Z] \W匹配任意非普通字符:[^_0-9a-zA-Z] |
re.findall("\w+","hello$1")
re.findall("\W+","hello$1") |
['hello', '1']
['$'] |
匹配(非)空字符 | \s \S |
空字符:空格 \r \t \n \0 \s 匹配任意空字符 \S 匹配任意非空字符 |
re.findall("\s",'hello world\r\n\t\0') | [' ', '\r', '\n', '\t'] |
匹配(非)单词边界位置 | \b \B |
单词边界:数字字母下划线和其他字符的交界位置为单词的边界 \b 匹配单词的边界 \B匹配非单词的边界 |
re.findall(r"\Bis\b",'This is a test') | ['is'] |
三、转义字符
正则表达式特殊符号 :
. * ? $ '' "" [] {} () \ ^
如果想匹配特殊符号则加转义
eg:\"\.\" -----> "."
名字 | 字符 | 含义 | 示例 | 结果 |
转移 | r |
raw 原生字符串 : 不进行转义 |
re.findall(r"\bis",'This is') re.findall('ok\?','Are your ok?') |
['is'] ['ok?'] |
四、贪婪和非贪婪
正则表达式默认的重复匹配模式:贪婪模式
尽可能多的向后匹配
* + ? {m,n} 这四种情况下会产生贪婪模式
非贪婪模式 : 尽可能少的匹配内容,满足正则表达式含义即可
贪婪---》非贪婪 : *? +? ?? {m,n}?
示例 | 结果 |
re.findall("ab*?",'abbbbbbbbcded') | ['a'] |
re.findall("ab+?",'abbbbbbbbcded') | ['ab'] |
五、正则表达式分组
可以使用()为一个正则表达式建立子组,子组可以看做正则表达式的一个局部整体
子组的作用
1. 增加子组后对正则表达式整体的匹配内容没有影响
2. 子组可以改变重复元字符的重复行为
3. 子组在某些操作中可以对子组匹配内容单独提取
子组的注意事项
1.每个正则表达式可以有多个子组,由外到内由左到右为第一第二。。。。子组
2.子组通常不要交叉
捕获组和非捕获组(命名组和非命名组)
子组命名格式
(?P<name>pattern)
eg:re.search(r'(?P<dog>ab)cdef','abcdefgh').group()
命名作用 :
1.很多编程接口可以直接通过名字获取子组匹配内容
2.捕获组中的正则表达式可以通过名字重复调用
(?P=name)
正则表达式设计原则
1. 正确性,能够正确的匹配要求内容
2. 唯一性,除了需要匹配的内容,尽可能不匹配不需要 的内容
3. 全面性,对目标特征考虑全面不遗漏
作用 | 示例 | 结果 |
重复 | re.search(r'(ab)+','ababababcdef').group() | 'abababab' |
或 | re.search(r'.+(\.com|\.cn)','[email protected]').group() | '[email protected]' |
提取 | re.search(r'(ab)+','ababababcdef').group(1) | 'ab' |
re.search(r'(?P<dog>ab)cdef','abcdefgh').group() | 'abcdef' | |
re.search(r'(?P<dog>ab)cd(?P=dog)',"abcdab").group() | 'abcdab' |
六、re模块
regex = re.compile(pattern,flags = 0)
功能:生成正则表达式对象
参数:pattern 正则表达式
flags 功能标志位,丰富正则的匹配功能
返回值: 正则表达式对象
list = re.findall(pattern,string,flags)
功能 : 根据正则表达式匹配目标字符串
参数 : pattern 正则表达式
string 目标字符串
返回 : 返回一个列表,内部为匹配到的内容
* 如果正则表达式有分组则只显示子组内容
list = regex.findall(string,pos=0,endpos=999)
功能 : 根据正则表达式匹配目标字符串
参数 : string 目标字符串
pos 标明从目标字符串的哪个位置开始匹配
endpos 标明匹配到目标字符串的哪里
返回 : 返回一个列表,内部为匹配到的内容
re.split(pattern,string,flags=0)
功能 : 通过正则表达式分隔字符串
参数 : pattern 正则
string 目标字符串
返回值 : 分割后字符串列表
re.sub(pattern,replaceStr,string,max,flags)
功能: 替换正则表达式匹配到的内容
参数: pattern 正则
replaceStr 要替换的内容
string 目标字符串
max 最多替换几处
返回值 : 返回替换后的字符串
re.subn(pattern,replaceStr,string,max,flags)
功能: 替换正则表达式匹配到的内容
参数: pattern 正则
replaceStr 要替换的内容
string 目标字符串
max 最多替换几处
返回值 : 返回替换后的字符串和替换了几处
re.finditer(pattern,string,flags)
功能 : 使用正则表达式匹配目标字符串
参数: pattern 正则
string 目标字符串
返回值 : 将匹配内容生成迭代器
re.fullmatch(pattern,string,flags)
功能 : 完全匹配目标字符串
参数: pattern 正则
string 目标字符串
返回值 : 匹配到的内容 (match object)
obj = re.match(pattern,string,flags)
功能 : 匹配目标字符串开头
参数: pattern 正则
string 目标字符串
返回值 : 匹配到的内容 (match object)
obj = re.search(pattern,string,flags)
功能 : 匹配目标字符串,只能匹配第一处
参数: pattern 正则
string 目标字符串
返回值 : 匹配到的内容 (match object)
* 生成match对象如果失败会返回None ,则无法调用match对象属性,此时会产生异常。
compile生成的正则对象属性
pattern 正则对象对应的正则表达式
flags 获取标志位值
groupindex 获取捕获组形成的字典 组名为键,第几组为值
groups 多少子组
七、附录:目录