正则表达式 python

一、正则表达式

1. 字符
语法说明表达式匹配结果
一般字符原文匹配,自己匹配自己love中国love中国
.匹配换行符“\n”之外的任意字符,DOTALL模式则没限制a.gaeg
\转义字符,使后一个字符改变原来的意思a\.g
a\\g
a.g
a\g
[ ]字符集/类,字符可以逐个列出,连续字符可以简写,如abcd写成a-d,第一个字符前加^表示取反,如[^abd]表示去匹配abc之外的字符,所有特殊字符在[ ]失去特殊含义,若用-、]或^前面要加反斜杠或把]、-放在第一位,^放在非第一位a[bd.g]eabe
a.e
age
2.预定义字符集(可写在 [ ] 中)
语法说明表达式匹配结果
\d数字:[0-9]a\dga8g
\D非数字:[^\d]a\Dga哈g
\s空白字符:[<空格>\t\r\n\f\v]a\sga g
\S非空白字符:[^\S]a\Sgadg
\w单词字符:[A-Za-z0-9_]a\wcafg
\W非单词字符:[^\W]a\Wga g
2.数量词(在字符或 ( ) 之后)
语法说明表达式匹配结果
*匹配前一个字符0次或无限次adg*ad
adgggg
+匹配前一个字符1次或无限次adg+adg
adggg
?匹配前一个字符0次或1次adg?ad
adg
{m}匹配前一个字符m次ad{3}gadddg
{m,n}匹配前一个字符m到n次ad{2,3}gaddg
adddg
*? +? ??
{m.n}?
使 * + ? {m,n} 变成非贪婪模式
3.边界匹配
语法说明表达式匹配结果
^匹配字符串开头。在多行模式中匹配每一行的开头^adgadg
$匹配字符串末尾。在多行模式中匹配每一行的末尾adg$adg
\A仅匹配字符串开头\Aadgadg
\Z仅匹配字符串末尾adg\Zadg
\b单词边界,零宽断言,只匹配一个单词的开始位置或者结束位置。单词是由字母或者数字构成的序列,由空格或者非字母数字字符作为结束标志。如 class 作为单独的一个完整单词的时候才会被匹配,当 class 是其他单词的一部分时不会被匹配a\b!dga!dg
\B[^\b],匹配非单词边界a\Bdgadg
4.逻辑、分组
语法说明表达式匹配结果
|左右表达式任意匹配一个。先左后右,左匹配则跳过右。若 | 不在 ( ) 中,则它的范围是整个正则表达式。如果需要匹配字符‘|’,使用 \|,或者将它放在一个字符类中[|]。adg123
( )被括起来的表达式将作为分组,从左开始每遇到一个分组的左括号’(',编号+1。分组表达式作为一个整体,可以后接数量词,表达式中的 | 仅在该组中有效(adg){2}
e(qwe
123)c
(?P<name>…)分组,除了原有编号外再起个别名(?P<id>adg)adgadg
\<number>应用编号为<number>的分组匹配到的字符串(\d)adg\11adg1
3adg3
(?P=name)引用别名为<name>的分组匹配到的字符串(?P<id>)adg(?P=id)1adg1
4adg4
5.特殊构造(不作为分组)
语法说明表达式匹配结果
?:…( ) 的不分组版本,用于使用‘|’ 或后接数量词(?:adg){2}adgadg
(?iLmsux)iLmsux中每个字符代表一种匹配模式,智能用在正则表达式的开头(?i)adgAdG
(?#…)#号后的内容作为注释被忽略adg(?#comment)123adg123
(?=…)之后的字符串内容需要匹配表达式才算成功,不消耗字符串内容a(?=\d)后面是数字的a
(?!..)之后的字符串内容需要不匹配表达式才算成功,不消耗字符串内容a(?!\d)后面不是数字的a
(?<=…)之前的字符串内容需要匹配表达式才算成功,不消耗字符串内容(?<=\d)a前面是数字的a
(?<!..)之前的字符串内容需要不匹配表达式才算成功,不消耗字符串内容(?<!\d)a前面不是数字的a
(?(id/name))
yes-pattern|no-pattern
如果编号为id或别名为name的组匹配到字符串,则需要匹配yes-pattern,否则需要匹配no-pattern。|no-pattern可省略(\d)adg(?(1)\dadg)

二、RE模块

  • 匹配一个反斜杠字符‘\’,你需要写成 ‘ \\ ’。解决方法是使用Python中的原始字符串,即在字符串最前面加上字母 r,这样字符串中的反斜杠都会被去掉特殊语义,看做普通字符。比如,字符串 r”\n” 是 包含‘\’和‘n’两个字符的字符串,而字符串 “\n” 是只有一个换行符的字符串。正则表达式通常使用 Python 中的原始字符串来表示。
1.匹配对象实例也有一些方法和属性,这里列出最重要的几个:
  • match()方法是判断正则表达式是否从开始处匹配字符串,所以start()方法总是返回 0。然而,search()方法就不一样了,它扫描整个字符串,匹配的子字符串的开始位置不一定是 0。
  • findall()方法需要在它返回结果之前创建出整个列表。但是finditer()方法将匹配对象作为迭代器返回(译者注:迭代器的方式更节省内存,效率更高)。
2.模块级别的函数:

不需要去创建一个匹配对象来调用它的方法,re 模块中也提供一些全局函数比如 match()、search()、findadd()、sub()等等。这些函数的第一个参数是正则表达式字符串,其他参数跟模式对象同名的方法采用一样的参数,返回值也一样,都是返回 None。由于内部缓冲机制,两者的效率不差上下。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值