python-正则表达式

1.正则表达式

(在多种语言中通用,但是有些语言中正则是封装)
1.扒数据(在大量的代码里面筛选某一个信息)
2.匹配符合条件的数据
2.匹配单个字符

match:只读第一字符,从右边开始的第一字符,第一个不符合就不符合。

search:则可以在所有字符的搜索,只要其中有一个字符就ojbk。

python-正则表达式
python-正则表达式

注意点
\d 等价以为数字(0-9),只代表一个
[]限制数据,连续可以[1-8](12345678);(123789)[1-37-9],也是一个字符
\s 匹配空白,即 空格,tab键
\w 匹配单词字符,即a-z、A-Z、0-9、_、汉字 (只要符合utf-8编码的都ojbk)

3.匹配多个字符

其实就是单个字符的工具和其组合去判断
python-正则表达式
python-正则表达式

?的作用:
python-正则表达式
电话号码判断方式:
python-正则表达式
python-正则表达式

.* 除了\n为的任意字符,如果要匹配\n 添加re.S
python-正则表达式

  • 匹配前一个字符出现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.匹配分组

python-正则表达式

注意点:| (匹配左右的任意表达式) 要加小括号 也就是 将 或 的范围分清楚了 不加 则 | 的之前为一个,| 的后面为一个
python-正则表达式

小括号:可以单独取出来 在group里面传参数,从左往右走 如上
python-正则表达式
\num 引用分组num匹配到的字符串 (一定要一一对应),为了方便常会去取名:
(?P) 分组起别名
python-正则表达式
注意:(?P)和(?P=name)中的字母p大写
python-正则表达式

5.re模块的高级用法【python独有】

search:不会从头匹配,只要里面有符合要求的就ojbk,找到了就结束,不管后面有没有,有也不会读取到。
search(r”^d+”, ccccc) 等价于 match

findall:找到所有符合要求的,返回值为列表,并且不用group

sub:能够替换,只有匹配的地方都会替换。并且不用group
python-正则表达式
sub还满足函数的引用
python-正则表达式

split:切割,返回一个列表
^a 只要不是a
python-正则表达式

6.贪婪和非贪婪

Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;
非贪婪则相反,总是尝试匹配尽可能少的字符。
在"*","?","+","{m,n}"后面加上?,使贪婪变成非贪婪。

7.r的作用

Python中字符串前面加上 r 表示原生字符串,数据里面的反斜杠不需要进行转义,针对的只是反斜杠
Python里的原生字符串很好地解决了这个问题,有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。
建议: 如果使用使用正则表达式匹配数据可以都加上r,要注意r针对的只是反斜杠起作用,不需要对其进行转义

>>> ret = re.match(r"c:\\a",mm).group()
>>> print(ret)
c:\a