首页 > 其他 > 详细

正则表达式

时间:2020-09-20 20:39:55      阅读:47      评论:0      收藏:0      [点我收藏+]

    正则表达式

  正则表达式的模式可以包含普通字符(包括转义字符)、字符类和预定义字符类、边界匹配符、重复限定复、选择分支、分组和引用等。

一、普通字符和转义字符

  普通字符包括ASCII字符、Unicode字符和转义字符。

  正则表达式中的元字符如果想要作为普通字符使用,则需要转义,例如  \$

 

二、预定义字符类

  

常用的预定义字符类
预定义字符 说明
\d 数字,等价于[0-9]
\D 非数字,等价于[^0-9]
\s 空白字符,等价于[\t\n\r\f\v]
\S 非空白字符,等价于[^\t\n\r\f\v]
\w 单词字符,等价于[a-zA-Z0-9_]
\W 非单词字符,等价于[^a-zA-Z0-9_]

 

三、常用的元字符相关说明和分类

  为了能够使用户更加灵活地定制模式内容,正则表达式提供了 专门的“元字符”。

  所谓的元字符,就是指那些在正则表达式里具有特殊意义的专用字符串,可以用来规定其前导字符(即位于元字符前面的那些字符)在目标对象中出现的模式。

  以下为常用的元字符及说明:

元字符

描述
\

一般用于转义字符 

^ 匹配目标的开始位置(或在多行模式下是行首)
$ 匹配目标的结束位置(或在多行模式下是行尾)
. 匹配出换行符外地任何字符(默认)
[ 开始字符类定义
] 结束字符类定义
| 开始一个可选分支
( 子组的开始标记
) 子组的结束标记
? 量词,表示0次或1次的匹配
* 量词,表示0次或多次的匹配
+ 量词,表示1次或多次的匹配
{ 自定义量词开始标记
} 自定义量词结束标记

  模式在方括号内的部分称为“字符类”。在一个字符类中仅有以下可用元字符:

元字符 描述
\ 转义字符
^ 仅在作为第一个字符(方括号内)时,表明字符类取反
- 标记字符范围

四、边界匹配符

表达式匹配
^ 在字符串开始的地方匹配,符号本身不匹配任何字符
$ 在字符串结束的地方匹配,符号本身不匹配任何字符
\b 匹配一个单词边界,\b 匹配这样的位置:它的前一个字符和后一个字符不全是(一个是,一个不是或不存在) \w,符号本身不匹配任何字符
\B 匹配非单词边界,即左右两边都是\w范围或者左右两边都不是\w范围时的字符缝隙
\A 字符串开头,和^的区别是:\A只匹配整个字符串的开头,^只匹配每一行的开头
\Z 字符串结尾,和$的区别是:\Z只匹配整个字符串的结尾,$只匹配每一行的结尾

  例如表达式^aaa在匹配xxx aaa xxx时,匹配结果是:失败。因为^要求在字符串开始的地方匹配。

  表达式aaa$在匹配xxx aaa xxx时,匹配结果是:失败。因为$要求在字符串结束的地方匹配。

  表达式.\b.在匹配@@@abc时,匹配结果是:成功;匹配到的内容是@a;匹配到的位置开始于2,结束于4。 

  表达式\bend\b在匹配weekend,endfor,end时,匹配结果是:成功;匹配到的内容是end;匹配到的位置开始于15,结束于18。

   

 \b 详解请参考:https://www.cnblogs.com/litmmp/p/4925374.html

 本标题部分内容来自:https://www.liujiangblog.com/course/python/73

  部分来自书籍

五、重复限定符

  修饰匹配次数的特殊符号{},不用重复书写表达式就可以重复匹配。比如[abcd][abcd]可以写成[abcd]{2}

  

表达式匹配
{n} 表达式重复n次,比如\d{2}相当于\d\d,a{3}相当于aaa
{m,n} 表达式至少重复m次,最多重复n次。比如ab{1,3}可以匹配ababbabbb
{m,} 表达式至少重复m次,比如\w\d{2,}可以匹配a12,_1111,M123等等
? 匹配表达式0次或者1次,相当于{0,1},比如a[cd]?可以匹配a,ac,ad
+ 表达式至少出现1次,相当于{1,},比如a+b可以匹配ab,aab,aaab等等
* 表达式出现0次到任意次,相当于{0,},比如\^*b可以匹配b,^^^b等等

     其中有些例子一定要注意!比如ab{1,3}中重复的是b而不是ab(ab){1,3}这样重复的才是ab。表达式\^*b中重复的是\^而不是^,要从左往右读正则表达式,转义符号有更高的优先级,需要和后面的字符整体认读。

     表达式\d+\.?\d*在匹配It costs $12.5时,匹配的结果是:成功;匹配到的内容是12.5;匹配到的位置开始于10,结束于14。

 

     本标题内容来自:https://www.liujiangblog.com/course/python/73

六、匹配算法:贪婪和非贪婪(懒惰)模式

  1.贪婪性匹配算法是指重复限定符会导致正则表达式引擎试图尽可能多地重复前导字符,只有当这种重复会引起整个正则表达式匹配失败时引擎才会进行回溯。

例如:

import re

str = ‘<book><title><td>python</td><td>java</td><td>php</td></title>/book>‘
res = re.findall("<.+>",str)
print(res)
##输出:[‘<book><title><td>python</td><td>java</td><td>php</td></title>/book>‘]

Python正则匹配算法针对重复限定符,默认采用贪婪匹配算法。所以返回结果并不是<book>

2.懒惰性匹配算法
  贪婪性算法返回了最左边的最长匹配。如果在重复限定福后面加厚最“?”,则正则表达式引擎使用懒惰性匹配算法。
符号 说明
*? 重复0或任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或一次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复




七、选择分支

            在正则表达式中‘|’表示选择,用于选择匹配的多个可能的正则表达式中的一个。选择符‘|’的优先级最低,如果需要可以使用圆括号来限制选择符的作业范围。

    中国的电话号码一般为区号-电话号码,区号为3位或4位数字,电话号码位6位或8位数字。

re.findall(r"((0\d{2}|0\d{3})-(\d{8}|\d{6})","电话号码021-62232333")

  

八、分组和引用

 

1.分组缓存和引用

表达式在匹配时,表达式引擎会将小括号()包含的表达式所匹配到的字符串记录下来。在获取匹配结果的时候,小括号包含的表达式所匹配到的字符串可以单独获取。这是一个非常有用也非常重要的特性。在实际应用场合中,当用某种边界来查找,而所要获取的内容又不包含边界时,必须使用小括号来指定所要的范围。比如前面的 <td>(.*?)</td>"

 

其实,"小括号包含的表达式所匹配到的字符串"不仅是在匹配结束后才可以使用,在匹配过程中也可以使用。表达式后边的部分,可以引用前面"括号内的子匹配已经匹配到的字符串"。引用方法是\加上一个数字。\1引用第1对括号内匹配到的字符串,\2 引用第2对括号内匹配到的字符串……以此类推,如果一对括号内包含另一对括号,则外层的括号先排序号。换句话说,哪一对的左括号"("在前,那这一对就先排序号。举例如下:

 

 

表达式(‘|")(.*?)(\1)在匹配‘Hello‘, "World"时,匹配结果是:成功;匹配到的内容是‘Hello‘。再次匹配下一个时,可以匹配到 "World"。这里的(\1),动态的引用了(‘|")匹配到的结果。(单双引号)

 

 

表达式(\w)\1{4,}在匹配aa bbbb abcdefg ccccc 111121111 999999999时,匹配结果是:成功;匹配到的内容是ccccc。再次匹配下一个时,将得到999999999。这个表达式要求\w范围的字符至少重复5次,注意与\w{5,}之间的区别。

 

\0则引用整个被匹配的正则表达式本身。

 

 

表达式<(\w+)\s*(\w+(=(‘|").*?\4)?\s*)*>.*?</\1>在匹配<td id=‘td1‘ style="bgcolor:white"></td>时,匹配结果是成功。如果<td></td>不配对,则会匹配失败;如果改成其他配对,也可以匹配成功。这就是常用的HTML标签匹配方法。

2.分组命名和引用

  在Python中对组可以进行如下命名并引用:

  (?P< name > group) #组命名

  (?P=name)          #引用命名组

  

 m = re.search(r"(?P<Area>\d+)-(?P<No>\d+)","电话号码:021-62232333")
 print(m.groupdict())

 

 ##输出 {‘Area‘: ‘021‘, ‘No‘: ‘62232333‘}

3.分组的扩展语法

 请参考:www.baidu.com。。。。。。。。。。。。。。。。。 

 

九、常用的正则表达式

  

校验数字的相关表达式:

功能表达式
数字 ^[0-9]*$
n位的数字 ^\d{n}$
至少n位的数字 ^\d{n,}$
m-n位的数字 ^\d{m,n}$
零和非零开头的数字 ^(0|[1-9][0-9]*)$
非零开头的最多带两位小数的数字 ^([1-9][0-9]*)+(.[0-9]{1,2})?$
带1-2位小数的正数或负数 ^(\-)?\d+(\.\d{1,2})?$
正数、负数、和小数 ^(\-|\+)?\d+(\.\d+)?$
有两位小数的正实数 ^[0-9]+(.[0-9]{2})?$
有1~3位小数的正实数 ^[0-9]+(.[0-9]{1,3})?$
非零的正整数 ^[1-9]\d*$
非零的负整数 ^-[1-9]\d*$
非负整数 ^\d+$
非正整数 ^-[1-9]\d*|0$
非负浮点数 ^\d+(\.\d+)?$
非正浮点数 ^((-\d+(\.\d+)?)|(0+(\.0+)?))$
正浮点数 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$
负浮点数 ^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$
浮点数 ^(-?\d+)(\.\d+)?$

校验字符的相关表达式:

功能表达式
汉字 ^[\u4e00-\u9fa5]{0,}$
英文和数字 ^[A-Za-z0-9]+$
长度为3-20的所有字符 ^.{3,20}$
由26个英文字母组成的字符串 ^[A-Za-z]+$
由26个大写英文字母组成的字符串 ^[A-Z]+$
由26个小写英文字母组成的字符串 ^[a-z]+$
由数字和26个英文字母组成的字符串 ^[A-Za-z0-9]+$
由数字、26个英文字母或者下划线组成的字符串 ^\w+$
中文、英文、数字包括下划线 ^[\u4E00-\u9FA5A-Za-z0-9_]+$
中文、英文、数字但不包括下划线等符号 ^[\u4E00-\u9FA5A-Za-z0-9]+$
可以输入含有^%&’,;=?$\”等字符 [^%&’,;=?$\x22]+
禁止输入含有~的字符 [^~\x22]+

特殊场景的表达式:

功能表达式
Email地址 ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
域名 [a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
InternetURL [a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
手机号码 ^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
国内电话号码 \d{3}-\d{8}|\d{4}-\d{7}(0511-4405222、021-87888822)
身份证号 ^\d{15}|\d{18}$(15位、18位数字)
短身份证号码 ^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$(数字、字母x结尾)
帐号是否合法 ^[a-zA-Z][a-zA-Z0-9_]{4,15}$(字母开头,允许5-16字节,允许字母数字下划线)
密码 ^[a-zA-Z]\w{5,17}$(以字母开头,长度在6~18之间,只能包含字母、数字和下划线)
强密码 ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间)
日期格式 ^\d{4}-\d{1,2}-\d{1,2}
一年的12个月(01~09和1~12) ^(0?[1-9]|1[0-2])$
一个月的31天(01~09和1~31) ^((0?[1-9])|((1|2)[0-9])|30|31)$
xml文件 ^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
双字节字符 [^\x00-\xff](包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
空白行的正则表达式 \n\s*\r (可以用来删除空白行)
HTML标记的正则表达式 <(\S*?)[^>]*>.*?</\1>|<.*? />(对于复杂的嵌套标记依旧无能为力)
首尾空白字符的正则表达式 ^\s*|\s*$或(^\s*)|(\s*$)(可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等))
腾讯QQ号 [1-9][0-9]{4,} (腾讯QQ号从10000开始)
中国邮政编码 [1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
IP地址提取 \d+\.\d+\.\d+\.\d+ (提取IP地址时有用)
IP地址合法性判断 ((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))

    

 

正则表达式

原文:https://www.cnblogs.com/self-ferry/p/13694156.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!