5.2.1 正则表达式语法与子模式扩展语法

  正则表达式由元字符及其不同组合来构成,通过巧妙地构造正则表达式可以匹配任意字符串,并完成复杂的字符串处理任务。常用的正则表达式元字符如下表所示:

元字符 功能说明
. 匹单个字符配除换行符以外的任意
* 匹配*之前的字符或子模式的0次或多次出现
+ 匹配位于+之前的字符或子模式的1次或多次出现
- 用在[]之内,表示范围
| 匹配位于|之前或之后的范围
^ 匹配行首,匹配以^后面的字符串开头的字符串
$ 匹配行尾,匹配以$之前的字符串结束的字符串

匹配位于?之前的0个或1个字符。当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是“非贪心的”。

“非贪心的”模式匹配搜索到的、尽可能短的字符串,而默认的“贪心的”模式匹配搜索到的,尽可能长的字符串。

例如,在字符串“oooo”,"o+?",而“o+”匹配所有o

\ 表示位于\之后的转义字符
\num 此处的num是一个正整数。例如,“(.)\1”匹配两个连续的相同字符
\f 换页符匹配
\n 换行符匹配
\r 匹配一个回车符
\b 匹配单词头或单词尾
\B 与\b含义相反
\d 匹配任何数字,相当于[0-9]
\D 与\d含义相反,等效于[^0-9]
\s 匹配任何空白字符,包括空格、制表符、换页符,与[\f\n\r\t\v]等效
\S 与\s含义相反
\w 匹配任何字母、数字以及下划线,相当于[a-zA-Z0-9_]
\W 与\w含义相反,与[^A-Za-z0-9_]等效
() 将位于()内的内容作为一个整体来对待
{} 按{}中的次数进行匹配
[] 匹配位于[]中的任意一个字符
[^xyz] ^放在[]内表示反向字符集,匹配除x、y、z之外的任意字符
[a-z] 字符范围,匹配指定范围内的任何字符
[^a-z] 反向范围字符,匹配除小写英文字母之外的任何字符

  如果以“\”开头的元字符与转义字符相同,则需要使用“\\”,或者使用原始字符串。在字符串前加上字符r或R之后表示原始字符串,字符串中任意字符都不再进行转义。原始字符串可以减少用户的输入,主要用于正则表达式和文件路径字符串的情况,单如果字符串以一个"\"结束,则需要多些一个斜线,即以“\\”结束。

  具体应用时,可以单独使用某种类型的元字符,但处理复杂字符串时,经常需要将多个正则表达式元字符进行组合,下面给出几个简单实例。

  (1) 最简单的正则表达式是普通字符串,只能匹配自身。

  (2)'[pjc]ython'可以匹配'python'、'jython'、'cython'。

  (3)'[a-zA-Z0-9]'可以匹配任意一个大小写字母或数字。

  (4)'[^abc]'可以一个匹配任意一个除'a'、'b'、'c'之外的字符。

  (5)'python|perl'或'p(ython|erl)'都可以匹配'python'或'perl'。

  (6)子模式后面加上问号表示可选。r'(http://)? (www\.)? python\.org'只能匹配'http://www.python.org'、'http://python.org'、'www.python.org'和'python.org'。

  (7)'^http'只能匹配所有以'http'开头的字符串。

  (8)(pattern)*:允许模式重复0次或多次。

  (9)(pattern)+:允许模式重复1次或多次。

  (10)(pattern){m,n}:允许模式重复m~n次。

  (11)'(a|b) * c':匹配多个(包含0个)a或b,后面紧跟一个c。

  (12)'ab{1,}':等价于'ab+',匹配以字母a开头后面带1个或多个字母b的字符串。

  (13)'^[a-zA-Z]{1}([a-zA-Z0-9._]){4,19}$'匹配长度为5~20的字符串,必须以字母开头,可带数字、"_"、"."的字符串。

  (14)'^(\w){6,20}$':匹配长度为6-20的字符串,可以包含字母、数字、下划线。

  (15)'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$'家畅给定字符串串是否为合法IP地址。

  (16)'^(13[4-9]\d{8})|(15[01289]\d{8})$'检查给定字符串是否为移动手机号码。

  (17)'^[a-zA-Z]+$':检查给定字符串是否只包含英文字母大小写。

  (18)'^\w+@(\w+\.)+w+$'检查给定字符串是否为合法电子邮件地址。

  (19)'^(\-)? \d+(\. \d{1,2})? $':检查给定字符串是否为最多带有2位小数的正数或负数。

  (20)'[\u4e00-\u9fa5]':匹配给定字符串中的所有汉字。

  (21)'^\d{18}|\d{15} $':检查给定字符串是否为合法身份证格式。

  (22)'\d{4}-\d{1,2}-\d{1,2}':匹配指定格式的日期(2016-1-31)

  (23)'^(? = . * [a-z])(? = . * [A-Z])(? = . * \d)(? = . * [,._]) . {8,} $':检查给定字符串是否为强密码,必须同时包含英文大写字母、英文小写字母、数字或特殊符号(如英文逗号、英文句号、下划线),并且长度至少8位。

  (24)"(?!. * [\'\"\/;=%?).+":如果给定字符串中包含'\"、/、;、=、%、?则匹配失败。

  (25)'(.)\\1+':匹配任意字符的一次货多次重复出现。

  (26)'((? P<f> \b\w+\b)\s+(? P=f))':匹配连续出现两次的单词。

  

  注意:正则表达式只是进行形式上的检查,并不保证内容一定正确。

 

  正则表达式使用圆括号“()”表示一个子模式,圆括号内的内容作为一个整体出现,例如,“(red)+”可以匹配redred、redredred等多个重复red的情况。使用子模式扩展语法可以实现更加复杂的字符串处理,常用的扩展语法如下:

  

语法 功能说明
(? P<groupname>) 为子模式命名
(? iLmsux)

设置匹配标志,可以是几个字母的组合

每个字母含义与编译标志相同

(? :...) 匹配单不捕获该匹配的子表达式
(? P=groupname) 表示在此之前的命名为groupname的子模式
(? #...) 表示注释
( ? = ...) 用于正则表达式之后,表示如果“=”后的内容在字符串中出现则匹配,但不返回“=”之后的内容
( ? ! ...) 用于正则表达式之后,表示如果“!”后的内容在字符串中不出现则匹配,但不返回“!”之后的内容
(? <=....) 用于正则表达式之前,与(?=...)含义相同
(? <! ...) 用于正则表达式之前,与(?! ...)含义相同

 

  小提示:正则表达式语法实在是太多了,很难全部记住。我个人建议:学会学习和学会思考比学会知识更加重要,大家要做一个“知识分子”,遇到问题之后要知道解决问题的大致思路和方向,具体的细节(比如函数用法和参数)可以通过搜索或查看帮助文档来解决,不需要(也不可能)把一切都记到脑子里。善于搜索能让我们更快地解决问题,站在巨人的肩膀上才能事半功倍。当然,必要的基础知识还是要掌握和熟悉的,不然很难判断搜索到的内容是否正确,毕竟网上的资料实在是太杂乱了。

 

posted @ 2018-04-07 15:33  Avention  阅读(848)  评论(0编辑  收藏  举报