【Python基础知识库】Python中正则表达式

本文详细介绍了Python中正则表达式的使用,包括搜索、匹配、编译、查找所有、替换、分割和转义等关键函数,如search、match、compile、findall、sub、split和escape。同时,举例说明了如何手写正则来匹配邮箱地址,是学习Python正则表达式的重要参考资料。
摘要由CSDN通过智能技术生成

python中正则使用方式

正则表达式常用的匹配规则

模式 描述
****一般字符****
. 匹配除换行符"\n"和"\r"之外的任意字符,在re.S模式下则能匹配任意字符
\ 转义字符,使下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符,如果原始字符串中含有* . ? + $ ^ [ ] ( ) { } | \,需要在前面加转义字符\才能正确表示,或者在字符串前面加个r房子转义
[…] 字符集,用来表示一组字符,对应的位置可以是字符集中任意一个字符,字符集中的字符可以逐个列出,也可以给出范围如[abc]或[a-c],所有的特殊字符在字符集中都失去本原有的含义,需要加\进行转义;常见的字符集[0-9]、[a-z]、[A-Z]、^[\u4e00-\u9fa5]*$
[^…] 在字符集内的开头加入非,表示匹配不在字符集内的其他任意字符,如[^abc]表示匹配除abc之外的任意字符
****预定义字符集(可以写在字符集[…]中)****
\d 匹配任意数字,等价于[0-9]
\D 匹配任意非数字的字符,等价于[^\d]
\s 匹配空白字符,等价于[\t\n\r\f],如\t(Tab)、\r(回车)、’ '(空格)、\f(换页符)、\n(换行符)、\v(垂直制表符)
\S 匹配非空白字符,等价于[^\s]
\w 匹配字母数字及下划线,等价于[A-Za-z0-9_]
\W 匹配非字母数字及下划线的其他字符,等价于[^A-Za-z0-9_]
****数量词(用在字符或(…)之后)****
* 匹配前一个字符、子表达式0次或多次,例如abc*能匹配ab,也能匹配abc、abcc,*等价于{0,}
+ 匹配前一个字符、子表达式1次或多次,例如abc+,能匹配abc、abcc,但是不能匹配到ab,+号前的字符至少要匹配一次,+等价于{1,}
? 匹配前一个字符、子表达式0次或1次,例如do(es)?可以匹配到do或does,?等价于{0,1}
{n} 精确匹配前一个字符、子表达式n次,例如ab{2}c可以匹配到abbc,n为非负整数
{n,} 匹配前一个字符、子表达式至少n次(即[n,+∞]),例如ab{2,}c可以匹配到abbc或abbbbbbbc,n为非负整数
{,n} 匹配前一个字符、子表达式至多n次(即[0,n]),例如ab{,2}c可以匹配到ac、abc或abbc,n为非负整数
{n,m} 匹配前一个字符、子表达式最少匹配n次,最多m次(即[n,m]),例如ab{1,2}c可以匹配到abc或abbc,n, m为非负整数,且n<=m
*?, +?, ?? 默认情况下*、+和?的匹配模式是贪婪模式,即会尽可能对的匹配符合规则的字符,*?、+?和??表示启用对应的非贪婪模式。如对于字符串"Pythonnn",正则表达式Python+能匹配大整个字符串,而Python+?则匹配Python
{n,m}? 同上,启用非贪婪模式,即只匹配n次,n, m为非负整数,且n<=m
****边界匹配(不消耗待匹配字符串中的字符)****
^ 匹配字符串的开头,在多行模式下(re.M)匹配每一行的开头,如^abc可以匹配abc
$ 匹配字符串的末尾,在多行模式下(re.M)匹配每一行的末尾,如abc$可以匹配abc
\A 仅匹配字符串开头,如\Aabc可以匹配abc
\Z 仅匹配字符串末尾,如果存在换行,只匹配到换行前的结束字符串,如abc\Z可以匹配abc
\z 仅匹配字符串末尾,如果存在换行,同时还会匹配到换行符
\b 匹配单词边界,也就是指单词和空格间的位置,如er\b可以匹配到never中的er,但不能匹配到verb中的er
\B 匹配非单词边界,也就是指单词和空格间的位置,如er\B可以匹配到verb中的er,但不能匹配到never中的er,等价于[^\b]
\G 匹配最后匹配完成的位置
****逻辑、分组****
| 左右表达式任意匹配一个,类似于"或"。总是先尝试匹配左边的表达式,一旦成功匹配就跳过匹配右边的表达式;如果|没有被包括在()中,则它的范围是整个表达式。如123|456能匹配到123、456
(…) 匹配圆括号中的正则表达式,或者指定一个子组的开始和结束位置,被括起来的表达式将作为分组,从表达式的左边开始每遇到一个分组的左括号’(’,编号+1;另外分组表达式作为一个整体,后面可以接数量词;表达式中的|也只能在该组中生效。如(abc){2}能匹配到abcabc,而a(123|456)c能匹配到a123c、a456c
(?P<name>...) 给分组命名,除了愿有你的编号外在指定一个额外的别名,通过分组名字name既可以访问到子组匹配的字串,例如(?P<id>abc){2}能够匹配到abcabc
\<number> 引用序号为<number>对应的子组所匹配到的字符串,子组的序号从1开始计算;如果序号以0开头,或者3个数字的长度,那么不会被引用对应的子组,而是用于匹配八进制数字所表示的ASCII码值所对应的字符。例如(.+) \1会匹配"python python" 或 “66 66”,但不会匹配holysll"
(?P=name) 引用别名为<name>的分组匹配到的字符串,如(?P<id>\d)abc(?P=id)能够匹配到1abc1、5abc5
****特殊构造(不作为分组)****
(?:...) (…)的不分组版本,用于使用| 或后接数量词。如(?:abc){2}能匹配abcabc
(?aiLmsux) aiLmsux的每个字符代表一种匹配模式,(? 后可以紧跟着 ‘a’,‘i’,‘L’,‘m’,‘s’,‘u’,‘x’ 中的一个或多个字符,只能在正则表达式的开头使用,如(?i)abc匹配模式是忽略大小写,能够匹配abc、Abc、aBc、abC、ABc、AbC、aBC、ABC
(?#...) #后的内容将作为主食被忽略,如abc(?#comment)123能够匹配abc123
(?=...) 之后的字符串内容需要匹配表达式才能匹配成功,不消耗字符创的内容。如a(?=\d)能匹配后面全是数字的a
(?!...) 之后的字符串内容需要不匹配表达式才能匹配成功,不消耗字符创的内容。如a(?!\d)能匹配后面不是数字的a
(?<=...) 之前的字符串内容需要匹配表达式才能匹配成功,不消耗字符创的内容。如a(?<=\d)能匹配前面是数字的a
(?<!...) 之前的字符串内容需要不匹配表达式才能匹配成功,不消耗字符创的内容。如a(?<!\d)能匹配后面不是数字的a
(?(id/name)yes-pattern|no-pattern) 如果序号为id/别名为name的组匹配到字符,则需要尝试yes-patteren匹配规则,否则需要尝试no-pattern匹配规则,no-pattern是可选可省略。如(<)?(\w+@\w+(?:\.\w+)+)(?(1)>|$) 是一个邮件格式的正则表达式,可以匹配<lucy@outlook.com>lucy@outlook.com,但不会匹配<lucy@outlook.comlucy@outlook.com>

正则表达式的匹配模式:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值