Fork me on GitHub

正则表达式总结

前言:

正则表达式真是一个完美而强大的东西,之前陆陆续续地学过,但是都不是很系统地学习,所以专门抽空系统地学了一下,受益匪浅

正则表达式的使用

  1. 基本匹配
    正则表达式abc匹配abc
  2. 元字符
    元字符都有一些特殊的含义一下是一些元字符的介绍
    元字符 描述
    . 点匹配除换行符以外的任意字符
    [] 字符种类,匹配方括号内的任意字符
    [^] 否定字符种类,匹配除了方括号里的任意字符
    • 匹配>=0个重复的在*之前的字符
    • 匹配>=1个重复的在之前的字符
      ? ?之前的字符可选
      {n,m} 匹配num个中括号之前的字符(n<num<m)
      (xyz) 匹配与xyz完全相等的字符集
      | 或运算符,匹配符号前或后的字符
      \ 转义字符,用于匹配一些保留的字符{}[].
      ^%()|等等
      ^ 从开始匹配
      $ 从末端开始匹配

2.1 点运算符 .
点可以匹配任意单个字符,但不匹配换行符
例:s=”The fat cat sat on the mat”
re.findall(“.at”,s)的意思匹配任意一个字符后面跟着at字符串 所以匹配结果为 fat cat sat mat

2.2 字符集
方括号[]用来指定一个字符集在方括号中使用连字符来指定字符集的范围,在[]中的字符集不关心顺序,此外[.]中的’.’即为’.’’
例:s=”The fat cat sat on the mat.”
re.findall(“[Th]he”,s)的意思匹配以T或者t开头以he结尾的字符串,所以匹配结果为:The the
re.findall(“at[.]”,s)的意思匹配以at开头以’.’结尾的字符串,所以匹配结果为:at.

2.2.1 否定字符集
一般来说^表示一个字符串的开头,但它如果用在[]中表示为否定的意思
例:s=”The fat cat sat on the mat.”
re.findall(“[^t]he”,s)的意思匹配不是以t开头但是是以he结尾的字符串,所以匹配结果为:The
2.3 重复次数
+,?,*都是用来指定匹配子模式的次数

2.3.1 号是匹配在之前的字符出现>=0次
例:s=”The fat cat sat on the mat.”
re.findall(“[a-z]
“,s)的意思匹配小写字母出现次数>=0
所以结果:[‘’, ‘he’, ‘’, ‘fat’, ‘’, ‘cat’, ‘’, ‘sat’, ‘’, ‘on’, ‘’, ‘the’, ‘’, ‘mat’, ‘’, ‘’]
注意:这里如果出现次数为0其实匹配到了空

2.3.2 +号
+号是匹配在+号之前的字符出现>=1次
例:s=”The fat cat sat on the mat.”
re.findall(“[a-z]+”,s)的意思匹配小写字母出现次数>=1
所以结果:[‘he’, ‘fat’, ‘cat’, ‘sat’, ‘on’, ‘the’, ‘mat’]

2.3.4 ?
在正则表达式中?前的字符在匹配是可有可无
例:s=”The fat cat sat on the mat.”
re.findall(“[T]?he+”,s)的意思匹配以he结尾开头是T或者不是的字符串,所以结果为:The the

2.4 {}号
在正则表达式中{}是一个量词,常用来匹配它前面字符出现的次数
例:s=”The fat cat sat on the mat tt.”
re.findall(“t{1,2}”,s)的意思匹配出现一次或者两次的t,所以结果为:[‘t’, ‘t’, ‘t’, ‘t’, ‘t’, ‘tt’]

2.5 (…)特征标群
特征群其实就是写在(…)中的子模式,换句话讲就是匹配()里面正则表达式
例:s=”The fat cat sat on the mat tt.”
re.findall(“(T|t)”,s)的意思是匹配出现以t或者T开头以he结尾的字符串所以结果为:T t

2.6 |或运算符
|运算符表示或,用作判断条件
例:s=”The fat cat sat on the mat tt.”
re.findall(“(fat|cat)”,s)意思为匹配fat或者cat所以结果为:fat cat

2.7 转码特殊字符
反斜杠\在正则表达式中用以转义跟在其后的特殊字符,因为正则表达式中有些特殊字符不表示本身的意思,反斜杠就是让他们表示本身的意思

2.9 ^号
^用以检查匹配的字符是否在所匹配字符串的开头
例:s=”The fat cat sat on the mat tt.”
re.findall(“^[Tt]he”,s)意思为匹配以he结尾以T或者t开头的字符串,并且该字符串是在原字符串开头所以结果为:The

2.10 $
$用以检查匹配的字符是否在所匹配字符串的结尾
例:s=”The fat cat sat on the mat the”
re.findall(“^[Tt]he”,s)意思为匹配以he结尾以T或者t开头的字符串,并且该字符串是在原字符串结尾所以结果为:the

  1. 简写字符集
    正则表达式中也提供了一些简写

    简写 描述
    . 换行符外的所有字符
    \w 匹配所有字母数组,等同于[a-zA-Z0-9]
    \W 匹配所有非字母数字,等同于[^\w]
    \d 匹配数字,等同于[0-9]
    \D 匹配非数字,等同于[^\d]
    \s 匹配所有空格字符[\t\n\f\r\p{Z}]
    \f 匹配一个换页符
    \n 匹配一个换行符
    \r 匹配一个回车符
    \t 匹配一个制表符
    \v 匹配一个垂直制表符
    \p 匹配 CR/LF (等同于 \r\n),用来匹配 DOS 行终止符

4.1 ?=…前置约束(存在)
匹配规则:匹配的结果的后面存在满足?=…之后表达式的内容
例:s=”The fat cat sat on the mat”
re.findall(“[tT]he(?=\sfat)”,s)的意思是匹配The或者the但同时他们后面跟着fat所以匹配结果为:The
4.2 ?!…前置约束(不存在)
匹配规则:匹配的结果后面不存在满足?!…之后表达式的内容
例:s=”The fat cat sat on the mat”
re.findall(“[tT]he(?=\sfat)”,s)的意思是匹配The或者the但同时他们后面没有fat所以匹配结果为:the
4.3 ?<=…后置约束(存在)
匹配规则:匹配的结果的前面存在满足?=…之后表达式的内容
例:s=”The fat cat sat on the mat”
re.findall(“(?<=the\s)(fat|mat)”,s)的意思是匹配fat或者mat但同时他们的前面必须存在the,所以匹配结果是:mat
4.4 ?<!…后置约束(不存在)
匹配规则:匹配的结果的前面不存在满足?=…之后表达式的内容
例:s=”The fat cat sat on the mat”
re.findall(“(?<!the\s)(fat|mat)”,s)的意思是匹配fat或者mat但同时他们的前面必须没有the,所以匹配结果是:fat

一些实用的匹配规则

  1. 一个正确的网址 形如www.baidu.com or www.shanghai.gov.cn
    (www.|https://|http://).\w.\w.\w.[a-z]+ 匹配
    www.bai-du.gov.cn

  2. 匹配学院或者大学的名字
    .{2,10}(学院{1}|大学{1})(?=\s)

不断学习才能不断进步

欢迎大家和我交流安全上面的技术问题
我的邮箱:cyber-security@qq.com

-------------本文结束感谢您的阅读-------------