1.正则表达式
(在多种语言中通用,但是有些语言中正则是封装)
1.扒数据(在大量的代码里面筛选某一个信息)
2.匹配符合条件的数据
2.匹配单个字符
match:只读第一字符,从右边开始的第一字符,第一个不符合就不符合。
search:则可以在所有字符的搜索,只要其中有一个字符就ojbk。
注意点:
\d 等价以为数字(0-9),只代表一个
[]限制数据,连续可以[1-8](12345678);(123789)[1-37-9],也是一个字符
\s 匹配空白,即 空格,tab键
\w 匹配单词字符,即a-z、A-Z、0-9、_、汉字 (只要符合utf-8编码的都ojbk)
3.匹配多个字符
其实就是单个字符的工具和其组合去判断
?的作用:
电话号码判断方式:
.* 除了\n为的任意字符,如果要匹配\n 添加re.S
- 匹配前一个字符出现0次或者无限次,即可有可无
- 匹配前一个字符出现1次或者无限次,即至少有1次
4.匹配开头结尾
^ 匹配字符串开头
$ 匹配字符串结尾
import re
def main():
names = ["name!", "_name", "2_name", "__name__"]
for name in names:
ret = re.match("^[a-zA-Z_][a-zA-Z0-9_]*$", name)
if ret:
print("%s 符合要求,正则提取数据为%s" % (name, ret.group()))
else:
print("%s 不符合要求" % name)
if __name__ == '__main__':
main()
注意;
如果在正则表达式中用到了普通字符如.?等 只需要在其前面加 / 一个\进行转义。(面试题)
4.匹配分组
注意点:| (匹配左右的任意表达式) 要加小括号 也就是 将 或 的范围分清楚了 不加 则 | 的之前为一个,| 的后面为一个
小括号:可以单独取出来 在group里面传参数,从左往右走 如上
\num 引用分组num匹配到的字符串 (一定要一一对应),为了方便常会去取名:
(?P) 分组起别名
注意:(?P)和(?P=name)中的字母p大写
5.re模块的高级用法【python独有】
search:不会从头匹配,只要里面有符合要求的就ojbk,找到了就结束,不管后面有没有,有也不会读取到。
search(r”^d+”, ccccc) 等价于 match
findall:找到所有符合要求的,返回值为列表,并且不用group
sub:能够替换,只有匹配的地方都会替换。并且不用group
sub还满足函数的引用
split:切割,返回一个列表
^a 只要不是a
6.贪婪和非贪婪
Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;
非贪婪则相反,总是尝试匹配尽可能少的字符。
在"*","?","+","{m,n}"后面加上?,使贪婪变成非贪婪。
7.r的作用
Python中字符串前面加上 r 表示原生字符串,数据里面的反斜杠不需要进行转义,针对的只是反斜杠
Python里的原生字符串很好地解决了这个问题,有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。
建议: 如果使用使用正则表达式匹配数据可以都加上r,要注意r针对的只是反斜杠起作用,不需要对其进行转义
>>> ret = re.match(r"c:\\a",mm).group()
>>> print(ret)
c:\a