• regex正则表达式学习


    正则表达式

    动机
    1. 处理文本成为计算机常见工作之一
    2. 对文本内容的搜索提取是一项比较复杂困难的工作
    3. 为了快速方便处理上述问题,正则表达式技术诞生,主键发展为一个被众多语言使用的独立技术

    定义:即高级文本匹配模式,提供了搜索,替代等功能。本质是由一系列特殊符号和字符组成的子串,这个子串即是正则表达式。这个表达式描述了字符和字符的重复行为,可以匹配一类特征的字符串。

    目标:
    1. 熟练使用正则表达式符号
    2. 正确组合和理解一般的正则表达式
    3. 能够使用Python操作正则表达式

    正则表达式特点
    * 方便进行检索和修改
    * 支持语言众多
    * 灵活多样
    * mongo正则类型,django等框架作为url匹配,爬虫

    正则表达式的使用
    Python ----》 re模块 处理正则表达式

    re.findall(pattern,string)
    功能 : 使用正则表达式匹配字符串
    参数 : pattern 正则表达式
    string 目标字符串
    返回值 : 一个列表 匹配到的所有内容

    元字符 (即正则表达式中有特殊含义的符号)

    1. 普通字符
    元字符 : abc
    匹配规则 : 匹配相应的普通字符

    In [6]: re.findall("abc","abcdefghabcdhig")
    Out[6]: ['abc', 'abc']

    2. 或
    元字符 : ab|cd
    匹配规则 : 匹配|两边任意一个正则表达式符合的情况
    In [7]: re.findall("ab|cd","abcdefghabcdhig")
    Out[7]: ['ab', 'cd', 'ab', 'cd']
    * |两侧不要有没用的空格

    3. 匹配单一字符
    元字符 : .
    匹配规则: 匹配除了换行之外的任意字符
    f.o---》 foo fao f@o

    In [10]: re.findall("f.o","foo is not fao")
    Out[10]: ['foo', 'fao']

    4. 匹配开始位置
    元字符: ^
    匹配规则: 匹配一个字符串的开始位置
    ^Hello ---> Hello world : Hello

    In [14]: re.findall("^hello","hello world")
    Out[14]: ['hello']

    5. 匹配结束位置
    元字符: $
    匹配规则:匹配目标字符串的结束位置
    py$ ---> hello.py

    In [16]: re.findall("py$","hello.py")
    Out[16]: ['py']

    6. 匹配重复
    元字符 : *
    匹配规则: 匹配前面的正则表达式重复0次或多次
    fo* ---》 fo foo foooooooo f

    In [19]: re.findall("ab*","abbcdef")
    Out[19]: ['abb']

    7. 匹配重复
    元字符 : +
    匹配规则: 匹配前面的正则表达式重复1次或多次

    ab+ ---》 ab abbb abbbb
    In [23]: re.findall(".+py$","hello.py")
    Out[23]: ['hello.py']

    8. 匹配重复
    元字符: ?
    匹配规则: 匹配前面的正则表达式重复0次或1次
    ab? --> a ab

    In [24]: re.findall("ab?","abcdefa")
    Out[24]: ['ab', 'a']

    9. 匹配重复
    元字符: {n}
    匹配规则 : 匹配指定的重复次数
    ab{3} ---> abbb
    In [25]: re.findall("ab{3}","abbbbbbbb")
    Out[25]: ['abbb']

    10. 匹配重复
    元字符 : {m,n}
    匹配规则 : 匹配前面的正则表达式重复 m次 到 n次
    ab{3,5} abbb abbbb abbbbb
    In [26]: re.findall("ab{2,5}","abcdabbbabbbbbb")
    Out[26]: ['abbb', 'abbbbb']

    11. 匹配字符集合
    元字符: []
    匹配规则 : 匹配括号范围内的任意一个字符
    [abc123d] a b c 1 2 3 d
    [a-z]
    [A-Z]
    [0-9]
    [123a-zA-Z]
    In [31]: re.findall("[_0-9a-zA-Z]","Hello world 123")

    12. 匹配字符集合
    元字符: [^...]
    匹配规则 : 匹配除指定字符集之外的任意字符

    In [34]: re.findall("[^abc]","nihao abc")
    Out[34]: ['n', 'i', 'h', 'o', ' ']

    13. 匹配任意(非)数字字符
    元字符: d D
    匹配规则 : d 匹配任意数字字符 D 匹配任意非数字字符
    [0-9] [^0-9]

    In [35]: re.findall("1d{10}","17611665537")
    Out[35]: ['17611665537']

    14. 匹配(非)普通字符 (普通字符: 数字字母下划线)
    元字符 : w W
    匹配规则: w 匹配任意一个普通字符 W匹配任意非普通字符
    [_0-9a-zA-Z] [^_0-9a-zA-Z]

    In [39]: re.findall("w+","hello$1")
    Out[39]: ['hello', '1']

    In [40]: re.findall("W+","hello$1")
    Out[40]: ['$']

    15. 匹配(非)空字符
    元字符 : s S
    匹配规则:s 匹配任意空字符 S 匹配任意非空字符
    [ ]

    In [45]: re.findall("s",'hello world ')
    Out[45]: [' ', ' ', ' ', ' ']

    16. 匹配起止位置
    元字符: A 
    匹配规则 : A匹配开始位置 匹配结束位置
    ^ $
    绝对匹配 Aabc ----> abc (且字符串只是abc)

    In [48]: re.findall("A/w+/w+",'/football/zhongchao')
    Out[48]: ['/football/zhongchao']

    17. 匹配(非)单词边界位置
    元字符:  B
    匹配规则 :  匹配单词的边界 B匹配非单词的边界

    单词边界 : 数字字母下划线和其他字符的交界位置为单词的边界

    abc_1 haha

    In [55]: re.findall(r"Bis",'This is a test')
    Out[55]: ['is']

    元字符总结

    匹配单个字符:a . d D w W s S [...] [^...]
    匹配重复性 : * + ? {N} {m,n}
    匹配某个位置 : ^ $ A   B
    其他 : | ()

    练习
    匹配长度8-10位的密码 必须以数字开头,数字字母下划线组成
    ^[0-9]w{7,9}$


    转义字符

    正则表达式特殊符号 :
    . * ? $ '' "" [] {} () ^
    如果想匹配特殊符号则加转义

    "." -----> "."

    r ---> raw 原生字符串 : 不进行转义

    In [64]: re.findall(r"is",'This is')
    Out[64]: ['is']


    贪婪和非贪婪

    正则表达式默认的重复匹配模式 : 贪婪模式
    尽可能多的向后匹配

    * + ? {m,n} 这四种情况下会产生贪婪模式

    非贪婪模式 : 尽可能少的匹配内容,满足正则表达式含义即可

    贪婪---》非贪婪 *? +? ?? {m,n}?

    In [70]: re.findall("ab*?",'abbbbbbbbcded')
    Out[70]: ['a']

    In [71]: re.findall("ab+?",'abbbbbbbbcded')
    Out[71]: ['ab']

    正则表达式分组

    使用()可以为一个正则表达式建立一个子组,子组可以看做内部的整体
    abcdef ----》 http://www.baidu.com

    子组的作用
    1. 增加子组后对正则表达式整体的匹配内容没有影响
    2. 子组可以改变重复元字符的重复行为
    3. 子组在某些操作中可以对子组匹配内容单独提取

    子组的注意事项
    1.每个正则表达式可以有多个子组,由外到内由左到右为第一第二。。。。子组
    2.子组通常不要交叉

    捕获组和非捕获组(命名组和非命名组)
    子组命名格式
    (?P<name>abc)
    1.很多编程接口可以直接通过名字获取子组匹配内容
    2.捕获组中的正则表达式可以通过名字重复调用
    (?P=name)

    (?P<dog>ab)cdef(?P=dog) -----> abcdefab

    In [83]: re.search('(ab)+','ababababab').group()
    Out[83]: 'ababababab'

    In [84]: re.search('(?P<dog>ab)cdef(?P=dog)','abcdefabcde').group()
    Out[84]: 'abcdefab'

    匹配身份证号
    d{17}(d|x)

    re模块

    obj = compile(pattern,flags = 0)
    功能: 获取正则表达式对象
    参数: pattern : 正则表达式
    flags: 功能标志位,提供更丰富的匹配
    返回值 : 正则表达式对象

    re模块和compile对象均有的函数

    obj.findall(string,pos,endpos)
    功能 : 通过正则表达式匹配字符串
    参数 : string 目标字符串
    pos 目标字符串的匹配开始位置
    endpos 目标字符串的结束位置
    返回值 : 匹配到的所有内容以列表返回

    * 如果正则表达式有子组则只显示子组匹配内容

    obj.split(string)
    功能 : 按照正则表达式切割目标字符串
    参数 : 目标字符串
    返回值 : 切割后的内容

    obj.sub(replaceStr,string,max)
    功能: 替换正则表达式匹配到的内容
    参数: replaceStr 要替换的内容
    string 目标字符串
    max 最多替换几处
    返回值 : 返回替换后的字符串

    subn(repl,string,count)
    功能: 替换正则表达式匹配到的内容
    参数: repl 要替换的内容
    string 目标字符串
    count 最多替换几处
    返回值 : 返回替换后的字符串和实际替换的个数


    re.finditer(pattern,string)
    功能 : 使用正则表达式匹配目标内容
    参数 : 目标字符串
    返回值 : 迭代对象 迭代的每个内容为一个match对象

    re.match(pattern,string)
    功能 : 匹配一个字符串的开头
    参数 : 目标字符串
    返回值 : 如果匹配到返回 match obj
    没有匹配到返回 None

    re.search(pattern,string)
    功能 : 匹配一个字符串
    参数 : 目标字符串
    返回值 : 如果匹配到返回 match obj
    没有匹配到返回 None
    * match 只能匹配字符串的开头位置,search可以匹配任意位置,但是也只能匹配一处
    * 通常match对象调用其属性时往往需要try异常处理

    fullmatch()
    要求目标字符串完全匹配


    compile 对象特有属性(re模块没有)
    flags : 标志位
    pattern : 正则表达式
    groupindex : 捕获组形成的字典
    groups : 多少个子组


    match 对象属性方法

    print(match_obj.pos) #目标字符串开头位置
    print(match_obj.endpos) # 目标字符串结束位置
    print(match_obj.re) # 正则表达式对象
    print(match_obj.string) # 目标字符串
    print(match_obj.lastgroup) # 最后一组的名字
    print(match_obj.lastindex) # 最后一组是第几组

    span() 匹配到内容的起止位置
    start() 匹配到内容的开始位置
    end() 匹配到内容的结束位置

    group(n)
    功能 : 获取match 对象匹配的内容
    参数 : 默认为0 表示获取正则整体的匹配内容
    如果传入大于0的正数则表示获取对应子组匹配内容
    返回值:返回匹配到的内容

    groups()
    功能 : 得到所有子组匹配的内容

    groupdict()
    功能 :得到所有捕获组匹配的内容


    作业 : 读取一个文件的内容 ,将文件中所有的以大写字母开头的单词匹配出来
  • 相关阅读:
    字符串加密
    接口实例
    RecyclerView添加Hearder
    基于Vue实现图片在指定区域内移动
    Tinymce 编辑器添加自定义图片管理插件
    LocalStorage和sessionStorage之间的区别
    javascript之url转义escape()、encodeURI()和decodeURI(),ifram父子传参参数有中文时出现乱码
    Js实现简单的音频播放
    通用CSS命名规范
    Hbuilder常用功能汇总
  • 原文地址:https://www.cnblogs.com/wcin/p/9119288.html
Copyright © 2020-2023  润新知