正则表达式,在对数据处理和爬虫阶段会用到。
re模块简介:
python自1.5版本起增加了re模块该模块提供了Perl风格的正则表达式模式
re模块使python语言拥有了全部正则表达式功能
三个函数:
match()
match(pattern,string ,flags=0)
尝试从字符串string的起始位置匹配一个pattern模式,如果不是起始部位匹配成功的话就返回None
pattern:匹配的正则表达式
string,要匹配的字符串
flgs:标志位,用于控制正则表达式的匹配方式
re.I:使匹配对大小写不敏感
re.L:做本地化识别匹配
re.M:多行匹配,影响$和`
re.S:使.匹配的包括换行符在内的所有字符
re.U:根据Unicode字符集解析字符,影响\w \W \b \B
re.X:通过给予我们功能灵活的格式以便更好的理解正则表达式
search()
search(pattern,string ,flags=0)
扫描整个字符串string 返回第一个成功的匹配对象
findall()
findall(pattern,string ,flags=0)
扫描整个字符串string返回一个列表
正则表达式:
1.匹配单个字符或数字
. 匹配任意字符,除换行符 当flags被指定为 re.S时,可以匹配包含换行符以内的所有字符
如果没有指定并且还想匹配所有字符 .\n
[]:密码是字符的集合,匹配[]里面任意一个字符
[a-z]:匹配所有小写字母
[A-Z],[0-9] [a-zA-Z] [^a-z]:除了a-z以外的任意字符
\d:配置任意的数字字符
\D:匹配任意的非数字字符
\w: 匹配包括下划线的任意单词和数字
\W: 匹非下划线的任意单词和数字
\s:匹配任意空白符(空格 换页 换行 回车 制表符)[\f\n\r\t]
\S 匹配非空白符。
锚字符
^ 行首匹配和[]中的不是一个意思。
$ 行尾匹配
边界字符:
\A: 匹配字符串开始,\A只匹配整个字符串的开头 即使在re.M下也不会匹配其他的行首
\Z: 匹配字符串结尾,\Z只匹配整个字符串的结尾 即使在re.M下也不会匹配其他的行尾
\b: 匹配一个单词的边界,指单词和空格的位置
\B: 匹配一个非单词的边界,指单词和空格的位置
匹配多个字符
(xyz)作为一个整体去匹配的
x? 匹配一个或者0个x,非贪婪
x* 匹配0个或任意个x
x+ 匹配至少一个x
x{n} 匹配n个x n是非负数
x{n,} 匹配至少n个x
x{n, m} 匹配至少n个 最多m个x
x|y 匹配x或者y
切分字符串
re.split(r" +",str)
finditer(pattern, string , flags=0)
作用:类似findall 返回一个跌抬起
区别:findall返回所有匹配的字符,并村委一个列表,如果数据太多,占用内存,而finditer
并不是直接返回所有找到的所有字符串,而且返回一个迭代器,可以通过next迭代
sub(pattern, repl, string, count=0, flags=0)
subn(pattern, repl, string, count=0, flags=0)
作用:在目标字符串string中朝赵匹配的pattern模式字符,再把他们替换成指定的repl字符串
可以指定最多替换count次,否则替换所有。
参数:
pattern:正则表达式
repl:替换的字符串
string:目标字符串
count:最多的次数
flags:标识一般不改变值
区别:sub 返回一个被替换的字符串,subn返回一个元组,元组第一个元素为被替换的字符串 第二个
元素为发生了多少次替换
分组:
概念:除了简单的判断是否匹配之外,正则表达式还有提取字符串的功能,用()表示的就是要提取的分组
m = re.search(r"(?P<aa>\d{3})-(?P<bb>\d{8})","aaa010-56781234bbb")
print(m.group(2))
print(m.group(1))
print(m.group("aa"))
编译:
概念:当在python中使用正则表达式时,re模块会做两件事情,一件事编译正则表达式,日过表达式的字符串本身不合法,会报错,一件是
用编译后的正则表达式去匹配字符串
re.compile()
优点:如果一个正则表达式要使用几千遍,每一次都会编译,处于时间的考虑提前编译就不用一次次的编译了。
贪婪匹配:
尽可能少的匹配
*?
+?
??