正则表达式的转义
1.如果使用正则表达式匹配特殊字符就需要加 ’ \ ’ 表示转义
特殊符号: . * + ? ^ $ [] () {} | \
e.g. 匹配特殊字符'.'时使用'\.'表示本身含义
>>> re.findall('-?\d+\.?\d*','123,-123,1.23,-1.23')
['123', '-123', '1.23', '-1.23']
2.在编程语言中,常常使用原生字符串(任何字符都是它本身的含义.没有转义的可能)书写正则表达式避免多重转义的麻烦
'\\$\\d+' 解析为 '\$\d+' 匹配 '$100'
'\\$\\d+' 等同于 r'\$\d+'
贪婪与非贪婪模式
1.贪婪模式 : 一般情况下,匹配重复的元字符总是尽可能多的向后匹配内容,比如:* + ? {m,n}
e.g. 匹配12,2可以出现0次或多次,他就会尽可能多的匹配2,这就是贪婪模式
>>> re.findall('12*','122222222223')
['12222222222']
2.非贪婪模式 : 一般情况下,匹配重复的元字符总是尽可能多的向后匹配内容
- 在匹配重复元字符后面加 ’ ? ’ 符号即可
e.g. 匹配12,2可以出现0次或多次,他就会尽可能少的匹配2,这就是非贪婪模式,也叫懒惰模式
>>> re.findall('12*?','122222222223')
['1']
正则表达式分组
- 定义:在正则表达式中,以()建立正则表达式的内部分组,子组是正则表达式的一部分,可以作为内部整体操作对象
- 作用:可以被作为整体操作,改变元字符的操作对象
>>> re.search(r'ab*','ababababab').group()
'ab'
>>> re.search(r'(ab)*','ababababab').group()
'ababababab'
- 可以通过编程语言某些接口获取匹配内容中,子组对应的内容部分
>>> re.search(r'(http|https)://\S+','http://www.baidu.com').group()
'http://www.baidu.com'
>>> re.search(r'(http|https)://\S+','http://www.baidu.com').group(1)
'http'
3.注意事项:
- 一个正则表达式中可以包含多个子组
- 子组可以嵌套,但是不要重叠或者嵌套结构复杂
- 子组序列号一般从外到内,从左到右计数