zoukankan      html  css  js  c++  java
  • 正则匹配

    正则表达式

    • . 匹配任意字符(不包括换行符)

    • ^ 匹配开始位置,多行模式下匹配每一行的开始

    • $ 匹配结束位置,多行模式下匹配每一行的结束

    • * 匹配前一个元字符0到多次

    • + 匹配前一个元字符1到多次

    • ? 匹配前一个元字符0到1次

    • {m,n} 匹配前一个元字符m到n次

    • 转义字符,跟在其后的字符将失去作为特殊元字符的含义,例如.只能匹配.,不能再匹配任意字符

    • [] 字符集,一个字符的集合,可匹配其中任意一个字符

    • | 逻辑表达式 或 ,比如 a|b 代表可匹配 a 或者 b

    • (...) 分组,默认为捕获,即被分组的内容可以被单独取出,默认每个分组有个索引,从 1 开始,按照"("的顺序决定索引值

    • (?iLmsux) 分组中可以设置模式,iLmsux之中的每个字符代表一个模式,用法参见 模式 I

    • (?:...) 分组的不捕获模式,计算索引时会跳过这个分组

    • (?P<name>...) 分组的命名模式,取此分组中的内容时可以使用索引也可以使用name

    • (?P=name) 分组的引用模式,可在同一个正则表达式用引用前面命名过的正则

    • (?#...) 注释,不影响正则表达式其它部分,用法参见 模式 I

    • (?=...) 顺序肯定环视,表示所在位置右侧能够匹配括号内正则

    • (?!...) 顺序否定环视,表示所在位置右侧不能匹配括号内正则

    • (?<=...) 逆序肯定环视,表示所在位置左侧能够匹配括号内正则

    • (?<!...) 逆序否定环视,表示所在位置左侧不能匹配括号内正则

    • (?(id/name)yes|no) 若前面指定id或name的分区匹配成功则执行yes处的正则,否则执行no处的正则

    • umber 匹配和前面索引为number的分组捕获到的内容一样的字符串

    • A 匹配字符串开始位置,忽略多行模式

    •  匹配字符串结束位置,忽略多行模式

    •  匹配位于单词开始或结束位置的空字符串

    • B 匹配不位于单词开始或结束位置的空字符串

    • d 匹配一个数字, 相当于 [0-9]

    • D 匹配非数字,相当于 0-9

    • s 匹配任意空白字符, 相当于 [ fv]

    • S 匹配非空白字符,相当于 fv

    • w 匹配数字、字母、下划线中任意一个字符, 相当于 [a-zA-Z0-9_]

    • W 匹配非数字、字母、下划线中的任意字符,相当于 a-zA-Z0-9_

     

    1) 贪婪语法 .*,取尽可能多的任意字符 w+,取尽可能多的任意英文字母与数字一次以上 d{2,5},尽可能取到2--5个数字字母 s+,},尽可能取到任意多个空格一次以上 .?,任意字符取0次,或1次,尽可能取1次

    2) 非贪婪语法 就是在贪婪定义后面加一个? .*?,取尽可能少的任意字符,尽可能不取 w+?,取尽可能少的任意英文字母与数字,尽可能只取1个 d{2,5},尽可能少数字字母,尽可能只取2个 s+,},尽可能取到最少空格,尽可能只取1个空格 .??,任意字符取0次,或1次,尽可能取0次

    3) 贪婪与贪婪的最终匹配 无论贪婪,还是非贪婪,都要与后面内容继续匹配,才能最终确定本次匹配内容,有时给合后面匹配内容时,两都取值相同

     

     

     

    匹配分组

    字符功能
    | 匹配左右任意一个表达式
    (ab) 将括号中字符作为一个分组
    um 引用分组num匹配到的字符串
    (?P<name>) 分组起别名
    (?P=name) 引用别名为name分组匹配到的字符串

     

     

     

    import re

    #匹配出163、126、qq邮箱

    ret=re.match("w{4,20}@163.com$","lisus2000@163.com")

    print(ret.group())

    ret=re.match("w{4,20}@(163|126|qq).com","test@qq.com")

    if ret:

      print(ret.group())

    else:

      print("不是163、126、qq邮箱") # 不是163、126、qq邮箱

     

     

    import re

    ret=re.match(r"<([a-zA-Z]*)>w*</1>","<html>hh</html>")

    print(ret.group())

    #因为2对<>中的数据不一致,所以没有匹配出来

    test_label = "<html>hh</htmlbalabala>"

    ret = re.match(r"<([a-zA-Z]*)>w*</1>", test_label)

    if ret:

      print(ret.group())

    else:

      print("%s 这是一对不正确的标签" % test_label)

    #需求:匹配出<html><h1>www.baidu.cn</h1></html>

    labels = ["<html><h1>www.baidu.cn</h1></html>", "<html><h1>www.google.cn</h2></html>"]

    for label in labels:

    ret=re.match(r"<(w*)><(w)>.</2></1>",label)

    if ret:

      print("%s 是符合要求的标签" % ret.group())

    else:

      print("%s 不符合要求" % label)

     

  • 相关阅读:
    C语言 了解原码、反码、补码
    中国大学MOOC-翁恺-C语言程序设计习题集(二)
    中国大学MOOC-翁恺-C语言程序设计习题集(一)
    【C#】 使用Gsof.Native 动态调用 C动态库
    【AspNetCore】【WebApi】扩展Webapi中的RouteConstraint中,让DateTime类型,支持时间格式化(DateTimeFormat)
    【TypeScript】如何在TypeScript中使用async/await,让你的代码更像C#。
    【vscode】如何在vscode 中配置:TypeScript开发node环境
    【WPF】分享自用 白板窗口(空窗口) 控件 BlankWindow,基于WindowChrome。
    【WPF】如何把一个枚举属性绑定到多个RadioButton
    【Python】调用WPS V9 API,实现Word转PDF
  • 原文地址:https://www.cnblogs.com/zjldeboke/p/12757496.html
Copyright © 2011-2022 走看看