python--正则表达式

元字符

  • \b:代表单词的开头或结尾,为单词的交界处;虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置。
  • .:匹配除了换行符以外的任意字符。
  • *:代表的是数量——它指定*前边的内容可以连续重复使用任意次以使整个表达式得到匹配,匹配重复任意次(可能是0次)。
  • .*:任意数量的不包含换行的字符。
  • +:同*,但匹配重复1次或更多次。
  • -不是元字符,只匹配它本身——连字符(或者减号,或者中横线,或者随你怎么称呼它)。

字符转义

如果你想查找元字符本身的话,比如你查找.,或者*,就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用\来取消这些字符的特殊意义。因此,你应该使用\.\*。当然,要查找\本身,你也得用\\.

后向引用

后向引用用于重复搜索前面某个分组匹配的文本。如匹配go go或自己指定子表达式的组名

零宽断言

  • 零宽度正预测先行断言:(?=exp),它断言自身出现的位置的后面能匹配表达式exp
    例:\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分);搜索I'm singing while you're dancing.,匹配singdanc

  • 零宽度正回顾后发断言:(?<=exp),它断言自身出现的位置的前面能匹配表达式exp
    例:(?<=\bre)\w+\b,匹配以re开头的单词的后半部分(除了re以外的部分);搜索reading a book,匹配ading
    例:((?<=\d)\d{3})+\b,要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了),查找需要在前面和里面添加逗号的部分;搜索1234567890,匹配234567890
    例:(?<=\s)\d+(?=\s),匹配以空白符间隔的数字(再次强调,不包括这些空白符)。

  • 负向零宽断言:只是想要确保某个字符没有出现,但并不想去匹配它。
    例:\b\w*q[^u]\w*\b,匹配里面出现了字母q,但是q后面跟的不是字母u的单词;搜索Iraq,Benq,匹配Iraq

  • 零宽度负预测先行断言:(?!exp),断言此位置的后面不能匹配表达式exp。
    例:\d{3}(?!\d),匹配三位数字,而且这三位数字的后面不能是数字。
    例:\b((?!abc)\w)+\b,匹配不包含连续字符串abc的单词。

  • 零宽度负回顾后发断言:(?<!exp),断言此位置的前面不能匹配表达式exp。
    例:(?<![a-z])\d{7},匹配前面不是小写字母的七位数字。

  • 例:(?<=<(\w+)>).*(?=<\/\1>),匹配不包含属性的简单HTML标签内里的内容。

    (?<=    # 断言要匹配的文本的前缀
    <(\w+)> # 查找尖括号括起来的内容
            # (即HTML/XML标签)
    )       # 前缀结束
    .*      # 匹配任意文本
    (?=     # 断言要匹配的文本的后缀
    <\/\1>  # 查找尖括号括起来的内容
            # 查找尖括号括起来的内容
    )       # 后缀结束
    

贪婪与懒惰

  • 规则:最先开始的匹配拥有最高的优先权。
  • 贪婪匹配:当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。
    例:a.*b,匹配最长的以a开始,以b结束的字符串;搜索aabab,匹配整个字符串aabab
  • 懒惰匹配:匹配尽可能少的字符。
  • 例:a.*?b,匹配最短的,以a开始,以b结束的字符串;搜索aabab,匹配aab
查找项正则表达式
hi\bhi\b
hi后面不远处跟着一个Lucy\bhi\b.*\bLucy\b
匹配1个或更多连续的数字\d+
填写的QQ号必须为5位到12位数字^\d{5,12}$
匹配3位区号的电话号码\(0\d{2}\d)[- ]?\d{8}|0\d{2}[- ]?\d{8}
描述一个正确的IP地址((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
kitty kitty或者go go\b(\w+)\b\s+\1\b
自己指定子表达式的组名\b(?<Word>\w+)\b\s+\k<Word>\b

尚未详细讨论的语法

代码/语法说明
\a报警字符(打印它的效果是电脑嘀一声)
\b通常是单词分界位置,但如果在字符类里使用代表退格
\t制表符,Tab
\r回车
\v竖向制表符
\f换页符
\n换行符
\eEscape
\0nnASCII代码中八进制代码为nn的字符
\xnnASCII代码中十六进制代码为nn的字符
unnnnUnicode代码中十六进制代码为nnnn的字符
\cNASCII控制字符。比如\cC代表Ctrl+C
\A字符串开头(类似^,但不受处理多行选项的影响)
\Z字符串结尾或行尾(不受处理多行选项的影响)
\z字符串结尾(类似$,但不受处理多行选项的影响)
\G当前搜索的开头
\p{name}Unicode中命名为name的字符类,例如\p{IsGreek}
(?>exp)贪婪子表达式
(?<x>-<y>exp)平衡组
(?im-nsx:exp)在子表达式exp中改变处理选项
(?im-nsx)为表达式后面的部分改变处理选项
(?(exp)yes|no)exp当作零宽正向先行断言,如果在这个位置能匹配,使用yes作为此组的表达式;否则使用no
(?(exp)yes)同上,只是使用空表达式作为no
(?(name)yes|no)如果命名为name的组捕获到了内容,使用yes作为表达式;否则使用no
(?(name)yes)同上,只是使用空表达式作为no

模块中的核心函数

函数说明
compile(pattern, flags=0)编译正则表达式返回正则表达式对象
match(pattern, string, flags=0)用正则表达式匹配字符串 成功返回匹配对象 否则返回None
search(pattern, string, flags=0)搜索字符串中第一次出现正则表达式的模式 成功返回匹配对象 否则返回None
split(pattern, string, maxsplit=0, flags=0)用正则表达式指定的模式分隔符拆分字符串 返回列表
sub(pattern, repl, string, count=0, flags=0)用指定的字符串替换原字符串中与正则表达式匹配的模式 可以用count指定替换的次数
fullmatch(pattern, string, flags=0)match函数的完全匹配(从字符串开头到结尾)版本
findall(pattern, string, flags=0)查找字符串所有与正则表达式匹配的模式 返回字符串的列表
finditer(pattern, string, flags=0)查找字符串所有与正则表达式匹配的模式 返回一个迭代器
purge()清除隐式编译的正则表达式的缓存
re.I / re.IGNORECASE忽略大小写匹配标记
re.M / re.MULTILINE多行匹配标记
re.S / re.SINGLELINE单行匹配标识
IgnorePatternWhitespace忽略空白匹配
ExplicitCapture显式捕获,仅捕获已被显式命名的组

总结

符 号解释示例说明
.匹配任意字符b.t可以匹配bat / but / b#t / b1t
\w匹配字母/数字/下划线b\wt可以匹配bat / b1t / b_t等,但不能匹配b#t
\s匹配空白字符(包括\r\n\t等)love\syou可以匹配love you
\d匹配数字\d\d可以匹配01 / 23 / 99
\b匹配单词的边界\bThe\b
^匹配字符串的开始^The可以匹配The开头的字符串
$匹配字符串的结束.exe$可以匹配.exe结尾的字符串
\W匹配非字母/数字/下划线b\Wt可以匹配b#t / b@t等,但不能匹配but / b1t / b_t
\S匹配非空白字符love\Syou可以匹配love#you等,但不能匹配love you
\D匹配非数字\d\D可以匹配9a / 3# / 0F
\B匹配非单词边界\Bio\B
[]匹配来自字符集的任意单一字符[aeiou]可以匹配任一元音字母字符
[^]匹配不在字符集中的任意单一字符[^aeiou]可以匹配任一非元音字母字符
*匹配0次或多次\w*
+匹配1次或多次\w+
?匹配0次或1\w?
{N}匹配N\w{3}
{M,}匹配至少M\w{3,}
{M,N}匹配至少M次至多N\w{3,6}
|分支foo|bar可以匹配foo或者bar
(?#)注释
(exp)匹配exp并捕获到自动命名的组中
(?<name>exp)匹配exp并捕获到名为name的组中
(?:exp)匹配exp但是不捕获匹配的文本
(?=exp)匹配exp前面的位置\b\w+(?=ing)可以匹配I'm dancing中的danc
(?<=exp)匹配exp后面的位置(?<=\bdanc)\w+\b可以匹配I love dancing and reading中的第一个ing
(?!exp)匹配后面不是exp的位置
(?<!exp)匹配前面不是exp的位置
*?重复任意次,但尽可能少重复a.*ba.*?b将正则表达式应用于aabab,前者会匹配整个字符串aabab,后者会匹配aabab两个字符串
+?重复1次或多次,但尽可能少重复
??重复0次或1次,但尽可能少重复
{M,N}?重复MN次,但尽可能少重复
{M,}?重复M次以上,但尽可能少重复

注意:如果需要匹配的字符是正则表达式中的特殊字符,那么可以使用\进行转义处理,例如想匹配小数点可以写成\.就可以了,因为直接写.会匹配任意字符;同理,想匹配圆括号必须写成\(\),否则圆括号被视为正则表达式中的分组。

超好用的测试正则的软件

百度网盘下载链接:https://pan.baidu.com/s/11jF03jPcrGxgGhNgciB6qQ
提取码:nz29。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值