10-正则
什么是正则表达式?
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符串及这些特定字符的组合,组成一个‘规则字符串’,这个‘规则字符串’用来表达对字符串的一种过滤逻辑。
http://tool.oschina.net/regex/ 开源中国在线正则表达式测试
模式 描述
\w 匹配字母数字及下划线
\W 匹配非字母数字下划线
\s 匹配任意空白字符,等价于 [\t\n\r\f].
\S 匹配任意非空字符
\d 匹配任意数字,等价于 [0-9]
\D 匹配任意非数字
\A 匹配字符串开始
\Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串
\z 匹配字符串结束
\G 匹配最后匹配完成的位置
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配字符串的开头
$ 匹配字符串的末尾。
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...] 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
[^...] 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
* 匹配0个或多个的表达式。
+ 匹配1个或多个的表达式。
? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
{n} 精确匹配n个前面表达式。
{n, m} 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a|b 匹配a或b
( ) 匹配括号内的表达式,也表示一个组
---------------------
re.match
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,mathc就返回none
re.match(pattern,string,flags=0) 3个参数 正则表达式、目标字符串、匹配模式
最常规的匹配
import re content = 'Hello 123 4567 World_This is a Regex Demo' print(len(content)) result = re.match('^Hello\s\d\d\d\s\d{4}\s\w{10}.*Demo$',content) print(result) print(result.group()) #返回匹配结果 print(result.span()) #输出匹配结果范围 打印结果 41 <_sre.SRE_Match object; span=(0, 41), match='Hello 123 4567 World_This is a Regex Demo'> Hello 123 4567 World_This is a Regex Demo (0, 41)
范匹配
import re content = 'Hello 123 4567 World_This is a Regex Demo' result = re.match('^Hello.*Demo$',content) #.*可以把中间的所有字符全部匹配到 print(result) 打印结果 <_sre.SRE_Match object; span=(0, 41), match='Hello 123 4567 World_This is a Regex Demo'>
匹配目标
import re content = 'Hello 1234567 World_This is a Regex Demo' result = re.match('^Hello\s(\d+)\sWorld.*Demo$',content) #想匹配1234567 指定左右端点 用括号(\d+)扩起来 print(result) print(result.group(1)) #输出第一个括号中的内容 #如果想输出匹配结果,要将匹配内容提前用括号括起来 打印结果 <_sre.SRE_Match object; span=(0, 40), match='Hello 1234567 World_This is a Regex Demo'> 1234567
贪婪模式
import re content = 'Hello 1234567 World_This is a Regex Demo' result = re.match('^He.*(\d+).*Demo$',content) print(result) print(result.group(1)) #因为.*尽可能多匹配到的是123456 所有打印group时只会输出7 打印结果 <_sre.SRE_Match object; span=(0, 40), match='Hello 1234567 World_This is a Regex Demo'> 7
非贪婪模式
import re content = 'Hello 1234567 World_This is a Regex Demo' result = re.match('^He.*?(\d+).*Demo$',content) #多了一个? 匹配尽可能少 字符 print(result) print(result.group(1)) 打印结果 <_sre.SRE_Match object; span=(0, 40), match='Hello 1234567 World_This is a Regex Demo'> 1234567
匹配模式
import re content = '''Hello 1234567 World_This is a Regex Demo ''' result = re.match('^He.*?(\d+).*Demo$',content) #打印结果为none,因为.*?不能匹配换行符 print(result) 打印结果 None #----------------------------------- #re.S可以代替换行符 import re content = '''Hello 1234567 World_This is a Regex Demo ''' result = re.match('^He.*?(\d+).*Demo$',content,re.S) print(result) print(result.group(1)) 打印结果 <_sre.SRE_Match object; span=(0, 41), match='Hello 1234567 World_This \nis a Regex Demo'> 1234567