【正则表达式一】正则表达式语法及应用

正则表达式

正则表达式(regular  expression)是⼀种⼯具,⼀种⼴泛⽤于匹配字符串的⼯具。它⽤⼀个“字符串”来描述⼀个特征,然后去验证另⼀个“字符串”是否符合这个特征。⽐如 表达式“ab+”描述的特征是“⼀个’a’和任意个’b’”,那么’ab’,‘abb’,'abbbbbbbbbb’都符合这个特征。

1、正则表达式语法

正则表达式本质上只做⼀件事,那就是编写⼀个表达式“字符串”,然后⽤这个字符串去匹配⽬标⽂本。核⼼的核⼼,都在编写这个“字符串”表达式上⾯。

1、re模块操作

在Python中需要通过正则表达式对字符串进⾏匹配的时候,可以使⽤⼀个模块,名字为re。

import re
 # 使⽤match⽅法进⾏匹配操作
 result = re.match(正则表达式,要匹配的字符串)
 # 如果上⼀步匹配到数据的话,可以使⽤group⽅法来提取数据
 result.group()

2、普通字符

字⺟、数字、汉字、下划线、以及没有特殊定义的符号,都是"普通字符"。正则表达式中的普通字符,在匹配的时候,只匹配与⾃身相同的⼀个字符。
例如:表达式c,在匹配字符串abcde时,匹配结果是:成功;匹配到的内容是c;匹配到的位置开始于2,结束于3。(注:下标从0开始还是从1开始,因当前编程语⾔的不同⽽可能不同)。

3、元字符

正则表达式中使⽤了很多元字符,⽤来表示⼀些特殊的含义或功能。

表达式匹配
.⼩数点可以匹配除了换⾏符\n以外的任意⼀个字符
|逻辑或操作符
[]匹配字符集中的⼀个字符
[^]对字符集求反,也就是上⾯的反操作。尖号必须在⽅括号⾥的最前⾯
-定义[]⾥的⼀个字符区间,例如[a-z]
\对紧跟其后的⼀个字符进⾏转义
()对表达式进⾏分组,将圆括号内的内容当做⼀个整体,并获得匹配的值

4、转义字符

⼀些⽆法书写或者具有特殊功能的字符,采⽤在前⾯加斜杠""进⾏转义的⽅法。

表达式匹配
\r,\n匹配回⻋和换⾏符
\t匹配制表符
\\匹配斜杠\
\^匹配^符号
\$匹配$符号
\.匹配⼩数点.
尚未列出的还有问号?、星号*和括号等其他的符号。所有正则表达式中具有特殊含义的字符在匹配⾃身的时候,都要使⽤斜杠进⾏转义。这些转义字符的匹配⽅法与普通字符类似,也是匹配与之相同的⼀个字符。

5、预定义匹配字符集

正则表达式中的⼀些表示⽅法,可以同时匹配某个预定义字符集中的任意⼀个字符。⽐如,表达式\d可以匹配任意⼀个数字。虽然可以匹配其中任意字符,但是只能是⼀个,不是多个。

表达式匹配
\d任意⼀个数字,0~9 中的任意⼀个
\w任意⼀个字⺟或数字或下划线,也就是 A-Z,a-z,0-9,_ 中的任意⼀个
\s空格、制表符、换⻚符等空⽩字符的其中任意⼀个
\D\d的反集,也就是⾮数字的任意⼀个字符,等同于[^\d]
\W\w的反集,也就是[^\w]
\S\s的反集,也就是[^\s]
例如表达式\d\d,在匹配abc123时,匹配的结果是:成功;匹配到的内容是12;匹配到的位置开始于3,结束于5。 (前提是⽤search来匹配,⽤match是匹配不到的)

6、重复匹配

前⾯的表达式,⽆论是只能匹配⼀种字符的表达式,还是可以匹配多种字符其中任意⼀个的表达式,都只能匹配⼀次。但是有时候我们需要对某个⽚段进⾏重复匹配,例如⼿机号码13666666666,⼀般的新⼿可能会写成\d\d\d\d\d\d\d\d\d\d\d(注意,这不是⼀个恰当的表达式),不但写着费劲,看着也累,还不⼀定准确恰当。
这种情况可以使⽤表达式再加上修饰匹配次数的特殊符号{},不⽤重复书写表达式就可以重复匹配。⽐如[abcd][abcd]可以写成[abcd]{2}。

表达式匹配
{n}表达式重复n次,⽐如\d{2}相当于\d\d,a{3}相当于aaa
{m,n}表达式⾄少重复m次,最多重复n次。⽐如ab{1,3}可以匹配ab或abb或abbb
{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等等

7、位置匹配

有时候,我们对匹配出现的位置有要求,⽐如开头、结尾、单词之间等等。

表达式匹配
^在字符串开始的地⽅匹配,符号本身不匹配任何字符
$在字符串结束的地⽅匹配,符号本身不匹配任何字符
\b匹配⼀个单词边界,也就是单词和空格之间的位置,符号本身不匹配任何字符
\B匹配⾮单词边界,即左右两边都是\w范围或者左右两边都不是\w范围时的字符缝隙
例如表达式^aaa在匹配xxx aaa xxx时,匹配结果是:失败。因为^要求在字符串开始的地⽅匹配。
表达式aaa 在匹配 x x x a a a x x x 时,匹配结果是:失败。因为 在匹配xxx aaa xxx时,匹配结果是:失败。因为 在匹配xxxaaaxxx时,匹配结果是:失败。因为要求在字符串结束的地⽅匹配。
表达式.\b.在匹配@@@abc时,匹配结果是:成功;匹配到的内容是@a;匹配到的位置开始于2,结束于4。
表达式\bend\b在匹配weekend,endfor,end时,匹配结果是:成功;匹配到的内容是end;匹配到的位置开始于15,结束于18。

8、贪婪和非贪婪模式

在重复匹配时,正则表达式默认总是尽可能多的匹配,这被称为贪婪模式。⽐如,针对⽂本dxxxdxxxd,表达式(d)(\w+)(d)中的\w+将匹配第⼀个d和最后⼀个d之间的所有字符xxxdxxx。可⻅,\w+在匹配的时候,总是尽可能多的匹配符合它规则的字符。同理,带有?、*和{m,n}的重复匹配表达式都是尽可能地多匹配。
但是有时候,这种模式不是我们想要的结果,⽐如最常⻅的HTML标签匹配。假设有如下的字符串:

 <table>
    <tr>
        <td>苹果</td>
        <td>桃⼦</td>
        <td>⾹蕉</td>
    </tr>
</table>

我们的意图是获取每个标签中的元素内容,那么如果你将正则表达式写成(.*)的话,你得到的是苹果桃⼦⾹蕉这么个东⻄,⽽不是“苹果”、“桃⼦”、“⾹蕉”。
在修饰匹配次数的特殊符号后再加上⼀个?问号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的"不匹配"。如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,⾮贪婪模式会最⼩限度的再多匹配⼀些,以使整个表达式匹配成功。表达式(.*?)匹配上⾯的字符串时,将只得到苹果,再次匹配下⼀个时,可以得到桃⼦,以此类推。

9、常用正则表达式

功能表达式
数字1*$
n位的数字^\d{n}$
⾄少n位的数字^\d{n,}$
零和⾮零开头的数字^(0|[1-9][0-9]*)$
有两位⼩数的正实数2+(.[0-9]{2})?$
⾮零的负整数^-[1-9]\d*$
⾮负浮点数^\d+(.\d+)?$
浮点数^(-?\d+)(.\d+)?$
特殊场景的表达式:
功能表达式
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})+/.?
⼿机号码^(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{15}|\d{18}$(15位、18位数字)
⽇期格式^\d{4}-\d{1,2}-\d{1,2}
空⽩⾏的正则表达式\n\s*\r (可以⽤来删除空⽩⾏)
IP地址提取\d+.\d+.\d+.\d+ (提取IP地址时有⽤)
腾讯QQ号[1-9][0-9]{4,} (腾讯QQ号从10000开始)

  1. 0-9 ↩︎

  2. 0-9 ↩︎

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值