Python 正则表达式基本语法

本文深入解析Python正则表达式的语法与特性,涵盖特殊字符、重复限定符及复杂模式匹配技巧,助您掌握高效文本处理利器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

Python中的正则表达式与Perl中具有许多相似的模式。
在Python正则表达式模式匹配中,有一个需要注意的事项是:

  • 反斜杠(\)的使用,
    1. 用于转义序列,如 \n ,表示两个字符”\“和”n“
    2. 用于特殊的含义,如 \n ,表示一个换行符

注意:为列解决上面的混淆,可以使用Python中原始字符转义语法,如 " r’\n’ ",表示与 \n 相同的含义。

正则表达式的来自于模块:import re

1. 正则表达式基本语法

1.1 正则表达式 pattern 有两种:

  • 特殊字符,如 ”|“ 和 ”(“ 等,这些字符要么表示原始字符,要么表示特殊含义影响模式匹配
  • 重复限定符,如 *, +, ?,{m,n} 等。
    • 它们不能直接进行嵌套,例如:为了将第二次重复应用于内部重复,可以使用括号。
    • 如__(?:a{6})*__,表示匹配多个6个a组成的字符。

1.2 一些特殊的模式匹配字符

字符含义
.匹配一个字符(除换行符以外的所有字符)
^仅匹配以特定字符串开头的模式
$仅匹配以特定字符串结尾的模式
*匹配>=0个字符模式,贪婪匹配
+匹配>=1个字符模式,贪婪匹配
?匹配0个或1个字符模式,贪婪匹配
*?
+?
??
在上述贪婪匹配限定符后添加 ?,表示一种非贪婪匹配
{m}指定重复的次数。a{6} 表示匹配6个 a
{m,n}表示匹配范围
a{3,5}:表示匹配3到5个 a
a{4,}b:表示至少4个 a
a{,5}b:表示至多5个 a
{m,n}?非贪婪匹配,匹配最少的模式
匹配 ‘aaaaaa’ 的模式:
a{3,5} 将返回5个 a
a{3,5}? 将返回3个 a
\1. 转义字符
2. 特殊字符
:建议除最简单的转义序列外,使用原始字符序列 ‘r’,如 'r\n’
[]1. 匹配其中的一个,如 [amk]
2. 可以指定一个范围,如 [a-z], [0-5][0-9]
3. 特殊限定符在 [] 中,将失去其特殊意义。如 [(+*)] ,将匹配其中的任意一个字符( ‘(’, ‘+’, ‘*’, ‘)’
4. 字符类依然表示其具体的范围。如 ‘[\w]’ 匹配任意字符中的一个
5. ^ 表示除指定字符外的任意一个字符。如 ‘[^5]’ 表示除 ‘5’ 以外的任意一个字符
|表示或,如 A|B 表示要么匹配 A , 要么匹配 B
(…)1. 匹配括号内正则表达式,并将所有匹配的内容进行分组标号(0,1,2 …)
2. 可以在执行匹配后检索子组的内容,并且以后可以在字符串中使用 \number 访问匹配的子组内容。如 re.compile(r’\b(\w+)\s+\1\b’)
(?..)(? 开头的为正则表达式的扩展语法(如下所示)
(?:…)非捕获组,即该子组匹配的字符串无法从后边获取
(?P<name>…)命名子组,通过组的名字(name)即可访问到子组匹配的字符串。其在以下三种情况下被调用
比如,正则表达式为 p = re.compile(’(?P[’"]).*?(?P=quote)’)
1. 用于正则表达式自身:(?:P=quote)\1
2. 用于match对象中:m.group(‘quote’)m.end(‘quote’)
3. 用于re.sub()函数的 repl 参数。形式如:\g<quote> , \g<1>\1
(?P=name)后向引用已命名的匹配的子组
(?#…)在模式匹配过程中,被忽略(不匹配)的内容
(?=…)前向肯定断言
如果当前包含的正则表达式(这里以 … 表示)在当前位置成功匹配,则代表成功,否则失败。
一旦该部分正则表达式被匹配引擎尝试过,就不会继续进行匹配了;剩下的模式在此断言开始的地方继续尝试。
如:Isaac (?=Asimov) 仅当匹配 “Asimov” 时,匹配字符串 “lsaac”
(?!..)前向否定断言
与前向肯定断言相反(不匹配则表示成功,匹配表示失败)
如:Isaac (?!Asimov) 表示仅当不匹配 “Asimov” 时,匹配字符串 “lsaac”
(?<=…)后向肯定断言
注意:正则表达式(以…表示)必须有固定的长度,这意味着允许使用abca|b,但不允许使用a*a {3,4}
使用 search() 函数而不是 match() 函数,以遍历所有可能的匹配项
import re
m = re.search(’(?<=abc)def’, ‘dfadabcdefjllkjl’)
m.group(0)
Out: ‘def’

m = re.search(r’(?<=-)\w+’, ‘spam-egg’)
m.group(0)
Out: ‘egg’
(?<!..)后向否定断言
(?(id/name)yes-pattern|no-pattern)1. 如果子组的序号或名字存在的话,则尝试 yes-pattern 匹配模式;否则尝试 no-pattern 匹配模式
2. no-pattern 是可选的
如:(<)?(\w+@\w+(?:.\w+)+)(?(1)>|$) 是一个匹配邮件格式的正则表达式,可以匹配 <user@host.com>user@fishc.com,但是不会匹配 <user@fishc.comuser@fishc.com>
\number匹配子组,序号从 1 开始
\A匹配输入字符串的开始位置(一句话的开始)
\Z匹配输入字符串的结束位置(一句话的结尾)
\b匹配单词的边界,以一个字符开始或结束的单词
\B匹配单词的边界,不以一个字符开始或结束的单词
\d匹配 [0-9] 数字中的一个数字
\D匹配 [^0-9] (除0-9以外)的任意一个字符
\s匹配 空白 字符,包括 [ \t\n\r\f\v] 中的任意一个(空格,换行符,制表符…)字符
\S匹配 非空白 字符,包括 [^ \t\n\r\f\v] (除空格,换行符,制表符…以外 )的任意一个字符
\w匹配 [a-zA-Z0-9_] 中任意一个字符
\W匹配 [^a-zA-Z0-9_] (除 a-zA-Z0-9_ 以外)中任意一个字符

参考

https://docs.python.org/3.8/library/re.html#module-re

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值