正则表达式常用方法有哪些(正则表达式之详细梳理)

正则表达式(regex)的定义

正则表达式是一套特殊字符和格式组成的对字符串进行运算的表达式,用表达式对目标字符串从左到右依次匹配,达成检索、过滤、摘取的目的。

正则表达式的功能
  1. 判断用户输入内容是否符合要求。将用户输入的内容与预先定义的表达式比对,若不符合要求则提示用户重输。通过表达式约束输入的数据可以能够提高程序效率并减轻服务器压力。常见案例如表单验证等。
  2. 从文件中获取所有符合表达式的内容。能够高效的从大段字符串中快速找到符合表达式的内容。常见案例如日志分析、爬虫等。
元字符
  • [ ] 一对中括号表示字符组,用来描述一个字符可匹配的规则。
  • [^] 非字符组,用来描述一个字符不可匹配的规则。
  • \ 在元字符前加\可用来取消元字符的特殊含义。
  • \d 匹配数字(小写d)。
  • \D 匹配非数字(大写D)。
  • \w 匹配数字字母下划线(小写w)。
  • \W 匹配非数字字母下划线(大写W)。
  • \s 匹配空格、制表符、换行符(小写s)。
  • \S 匹配非空白符(大写S)。
  • \t 匹配制表符(小写t)。
  • \n 匹配换行符(小写n)。
  • . 匹配除了换行符之外的所有(英文句号.)。
  • [\d\D]、[\w\W]、[\s\S] 匹配所有字符。
  • ^ 匹配整个字符串的开始,只能写在开头,不能写在中间或后面(在字符组中定义为非的意思)。
  • $ 匹配整个字符串的结束,只能写在结尾,不能写在中间或前面。
  • | 或,例如a|b表示匹配a或b的内容,若匹配a成功则不会继续匹配b(所以总是把长的表达式放前面)。
  • () 分组,约束作用范围,在python的re模块中有特殊用处。
  • \b 匹配单词的开头或结尾,例如\bw匹配hello world中的w,o\b匹配hello中的o。
字符组

描述的是一个位置上能出现的所有可能性(一对中括号只表示一个字符位置)。案例如下:

  • [abc]匹配a或b或c。
  • 范围匹配,可以描述多个范围,连着写即可。
  • [0-9]匹配数字0-9,ascii码48-57可匹配。
  • [A-Z]匹配大写英文字母A-Z,ascii码65-90可匹配。
  • [a-z]匹配小写英文a-z字母,ascii码97-122可匹配。
  • [a-zA-Z]匹配大小写字母。若用[A-z]匹配大小写英文字母还匹配[\]^_`这6个符号。
  • [0-9] -> \d 表示匹配数字 digit。
  • [0-9a-zA-Z_] -> \w 匹配数字、字母、下划线 word。
  • 空白符(空格|tab|enter) -> ( |\t|\n) -> \s 表示所有空白符。
量词

量词用来约束元字符生效次数,量词只能约束它前面的一个单元,可以是字符、字符组或分组。

{n} 表示匹配n次

{n,} 表示匹配最少n次

{n,m} 表示匹配最少n次、最多m次

? 表示匹配0次或1次 {0,1}

表示匹配1次或多次 {1,}

* 表示0次或多次 {0,}

关于 ? * 这三个符号经常会用到,请参考下图,务必要熟记它们的作用域。

正则表达式常用方法有哪些(正则表达式之详细梳理)(1)

请务必记住 ? * 这三个符号作用域

匹配模式(默认最大匹配)
  • 最大匹配(又称贪婪匹配)

在量词范围内尽可能多的匹配内容。例如:.*x表示匹配任意字符任意多次,遇到最后一个x才停止。

案例

表达式:\d{3,}6

目标:1234789135661947678914

结果:12347891356619476 (按回溯算法,从123开始一直匹配数字直到非数字或结束,再回溯找6)

  • 最小匹配(又称惰性匹配)

在量词范围内尽可能少的匹配内容,量词后面加个?表示最小匹配。例如:.*?x表示匹配任意字符任意多次,遇到首个x就停止。

案例

表达式:\d{3,}?6

目标:1234789135661947678914

结果:12347891356(按惰性匹配原则,从123开始一直匹配数字,一旦遇到6即停止匹配)

注意:2个??在一起的情况,前一个?是量词,表示匹配0或1次;后一个?表示最小匹配。例如:

1\d?3可以匹配13、123、133中的全部;1\d??3可以匹配13、123、133中的13、123、13(133不能匹配到,按惰性原则1数字可有可无,再后面找3,)

转义符

若需要使用元字符本身的意义时需要转义,在元字符前加\即可。

另外有一些有特殊意义的元字符,放在字符组中,会取消它的特殊意义。例如:

[().* ?] 中括号中的这些符号在字符组中会取消它们的特殊意义。

[a\-c] -在字符组中表示范围,若不希望它表示范围,需要用\转义或放在字符组的最前面或最后面。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页