串匹配正则表达式(re包规定的元字符)的代码实现(python语言)

re包规定的元字符:

.  ^  $  *  +  ?  \  |  {  }  [  ]  (  )
 - 贪婪匹配:与有可能匹配的最长子串匹配
    在这里 ab* 匹配 abbbbbb,* 运算符做贪婪匹配
 - 非贪婪匹配:与有可能匹配的最短子串匹配
  • 字符组表达式

    • 字符组表达式

    [abc]可以匹配字符a或b或c
    区间形式[0-9]是顺序列出的缩写,匹配数字字符0到9
    [0-9a-zA-Z]匹配所有英文大小写和数学字符

    • [^…]中的^表示求补

    [0-9]匹配所有非十进制数字的字符
    [^ \t\v\n\f\r]匹配所有非空字符(非空格/制表符/换行符)
    注:使用^时,^必须再首位

    • 原点字符
      a.b匹配所有以a开头b结尾的三字字符串

为了方便,re换意串定义了几个常用字符,如下:

\t  :与十进制数字的所有字符匹配,等价于[0-9]
\D  :与非十进制数字的所有字符匹配,等价于[^0-9]
\s  :与所有空白字符匹配,等价于 [ \t\v\n\f\r]
\S  :与所有非空白字符匹配,等价于 [^ \t\v\n\f\r]
\w  :与所有字母数字字符匹配,等价于 [0-9a-zA-Z]
\W  :与所有非字母数字字符匹配,等价于 [^0-9a-zA-Z]
  • 重复

    运算符是,α与α吃的0次或任意多次出现匹配

    • 重复运算符+表示1次或多次重复
      例:‘\d+’等价于‘\d\d*’
    • 可选片段用?运算符表示
      ?表示0次或1次重复
    • 确定重复次数的用{n}表示
      a{n}与a匹配的串的n次重复匹配
      a{m,n}与a匹配的串的m到n次匹配
 - + ? {m,n}都采用贪婪匹配
*? +? ?? {m,n}?都采用非贪婪匹配(在各运算符后面加问号)
  • 选择运算符
    |描述两种或多种情况之一的匹配
    a|b可以匹配a或b,等价于[ab]

  • 首尾匹配

    • 行首匹配:以^符号开头的模式,只能与一行的前缀子串匹配
    • 行尾匹配:以$符号结尾的模式,只与一行的后缀匹配
    • 串首匹配:\A 开头的模式只与被匹配串的前缀匹配
    • „串尾匹配:\Z 结束的模式只与被匹配串的后缀匹配
  • 单词边界

    • \b描述单词边界,它表示示单词边界匹配一个空串。单词是字母数字的连续序列,边界就是非字母数字字符或无字符(串开头/结束)
    • \B是\b的补,也是匹配空字符串,但要求相应的位置是数字或字母
>>>re.findall('py.\B', 'python, py2')
['pyt','py2']
  • 模式里面的组
    • ‰圆括号括起的模式段 (…) 也是模式,它与被括子模式匹配的串匹配。但在此同时还确定了一个被匹的“组”(字符段)
    • 被匹配的组可用\n形式在模式里面“引用”要求匹配同样字符段。这里的 n 表示一个整数序号,组从 1 开始编号
r'(.{2}) \1'可匹配'ok ok''no no',不能匹配'no ho'
  • 其他匹配操作
re.fullmatch( pattern, string, flags=0)
# 如果整个 string 与 pattern 匹配则成功并返回相应的 match 对象,
否则返回 None
re.finditer( pattern, string, flags=0)
# 功能与 findall 类似,但返回的不是表而是一个迭代器,使用该迭代器可顺序取得表示各非重叠匹配的 match 对象
re.sub( pattern, repl, string, count=0, flags=0)
# 做替换,把 string 里顺序与 pattern 匹配的各非重叠子串用repl代换。repl是串则直接代换;另一情况,repl 还可以是以match 对象为参数的函数,这时用函数的返回值代换被匹配子串
  • 匹配对象(match对象)
    • 取得被匹配的子串:mat.group()
      在一次成功匹配中,所用的正则表达式匹配了目标串的一个子串,操作 mat.group() 给出这个子串
    • 在目标串里的匹配位置:mat.start()
      得到 mat 代表的成功匹配在目标串里的实际匹配位置,这是目标串的一个字符位置(下标)
    • 目标串里被匹配子串的结束位置:mat.end()
      这个位置采用常规表示方式。设 text 是目标串,有如下关系:mat.group() == text[mat.start():mat.end()]
    • 目标串里被匹配的区间:mat.span()得到匹配的开始和结束位置形成的二元组mat.span() == mat.start(), mat.end()
    • mat.re 和 mat.string 分别取得得到这个 match 对象所做匹配的正则表达式对象和目标串
  • 正则表达式
    • 检索:regex.rearch(string[,pos[,endpos]])
      在给定的串 string 里检索,可以指定开始和结束位置。按 Python惯例,两个位置确定一个左闭右开的区间。默认从头到尾对 string 检索,只给了 pos 就从那里检索到最后。
    • 匹配:regex.match(string[,pos[,endpos]])
      检查给定的串string是否有与regex匹配的前缀。pos指定开始匹配前缀的位置,endpos给定被匹配段的终点。
    • 完全匹配:regex.fullmatch(string[, pos[, endpos]])
      检查 string 中所指定范围构成的那个子串是否与 regex 匹配,默认范围是整个串。
    • 下面两个方法与 re. 同名操作功能类似,但都可以指明匹配区间:
      regex.findall(string[, pos[, endpos]])
      regex.finditer(string[, pos[, endpos]])
    • 下面两个操作与 re. 同名操作功能相同
      切分:regex.split(string, maxsplit=0)
      替换:regex.sub(repl, string, count=0)
  • regex.pattern 取得生成 regex 所用的模式字符串

猜你喜欢

转载自blog.csdn.net/zhangyu4863/article/details/80453261
今日推荐