正则表达式详解

  1. 正则表达式主要用于对字符串进行特定的处理,如判断一串字符是否是手机号,一串字符中是否含有某些特定的字符,等等。

  2. Python中正则表达式的使用:

    import re
    str1 = "leon"
    str2 = "leonisagoodman"
    result = re.match(str1,str2)
    result.group()
    

    上面代码输出结果为:"leon"

  • 其中 str1 为pattern,即为某种特定的规则表示,str2为要匹配的字符串,如果str2满足str1的特定规则,则re.match()会返回一个匹配对象(Match Object),如果不满足,则会返回None(注意不是空字符串"",因为空字符串也可能是某种规则).
  • 如果用match方法匹配到数据的话,则可以调用group方法来提取数据。
  1. 单字符的匹配:
字符功能
.匹配任意单个字符(除了\n)
\d匹配任意单个数字
\D匹配任意单个非数字
[]匹配[]中列举的字符,[]中^为脱字符的意思,即除了[]里面列举的字符
\s匹配空白,如空格、\t、\n等
\S匹配非空白
\w匹配单词字符(0-9、a-z、A-Z、_)
\W匹配非单词字符

其中“ [] ”可以将上面的所有规则表示出来,如下所示:

字符用[]代替表示
.re.match("[^\n]",“XXX”)
\dre.match("[0-9]",“XXX”)
\Dre.match("[^0-9]",“XXX”)
\sre.match("[此处为表示空白的所有字符]",“XXX”)
\Sre.match("[^此处为表示空白的所有字符]",“XXX”)
\wre.match("[0-9a-zA-Z_]",“XXX”)
\Wre.match("[^0-9a-zA-Z_]",“XXX”)
  1. 表示数量
    用于对多个字符的表示。
字符功能
*表示0个或者任意个字符
+表示1个或者任意个字符,至少1个
表示0个或者1个字符
{m}表示m个字符
{m,}表示至少m个字符
{m,n}表示至少m个字符,至多n个字符

示例如下:

re.match("\d*","XXX") #匹配字符串中0个或者任意多个数字
re.match("\d+","XXX") #匹配字符串中至少1个数字
re.match("\d?","XXX") #匹配字符串中0个或者1个数字
re.match("\d{3}","XXX") #匹配字符串中3个数字
re.match("\d{3,}","XXX") #匹配字符串中至少三个数字
re.match("\d{3,5}","XXX") #匹配字符串中至少三个数字,至多5个数字

同样可以用 {} 将 * + ?分别表示出来,如下表:

字符用{}代替表示
*{0,}
+{1,}
{0,1}
  1. 原始字符串
    Python中字符串前面加上 r 表示原始字符串。原始字符串很好的解决了转义字符“\”的困扰。如下:
    在这里插入图片描述
    即 如果字符串“\nabc”前面加上 “ r ”,则解释器会自动的将这个字符串变成 “\nabc”。
    所以在匹配字符串 "\nabc"时,可以直接写成re.match(r"\nabc","\nabc"),而不用写成re.match("\\nabc","\nabc"),所以有了原始字符串就再也不用担心是不是漏写了反斜杠。应该养成习惯在前面加上“ r ”。

    注意点
    在这里插入图片描述

  2. 表示边界

字符功能
^匹配字符串开头
$匹配字符串结尾
\b匹配一个单词的边界
\B匹配非单词边界

示例如下:
在这里插入图片描述

  1. 表示分组
字符功能
|匹配左右任意一个表达式
()将括号中的字符作为一个分组
\num引用分组num匹配到的字符串
(?P<name>)给分组命名
(?P=name)引用分组名为name的分组匹配到的字符串

示例如下:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  1. re的一些高级用法
  • search() 和 findall()
    search用来搜索从左到右第一个匹配到的字符串,返回的是match对象。
    findall 用来搜索从左到右匹配到的所有字符串。注意:用findall返回的是一个列表,而不是match对象
    用法如下图所示:
    在这里插入图片描述
  • sub()
    sub用来用特定的字符串将匹配到的字符串进行替换,也可以将匹配到的字符串传进定义的函数里,进行处理后进行替换。用法如下图:
    在这里插入图片描述
  • split()
    split根据匹配进行切割字符串,并返回一个列表。用法如下:
    在这里插入图片描述
  1. 贪婪模式
    看下图:
    在这里插入图片描述
    会发现原本希望将后面的数字全部匹配到一起,结果前面两个8却匹配到了第一个分组中,这是因为第一个分组(.+)中的+是处于贪婪模式,它会在匹配的时候最大限度的满足自己,使后面分组(\d+-\d+-\d+)中的第一个\d+最小限度的满足即可(即第一个\d+只会匹配到一个8,而.+则匹配到The number is 88
    关闭贪婪模式的方法为:给该匹配字符后面加?。如下图:
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值