这里讲述了正则表达式有关的基础内容, 这里所涵盖的内容是不包含怎样去编写高效的正则表达式的, 也是不包含怎样去优化正则表达式的, 这些主题可去查看别的教程。
- 正则表达式语法
1.1 字符与字符类
1 特殊字符:\.^$?+*{}()|
以上特殊字符要想使用字面值,必须使用\进行转义
2 字符类
-
当中所包含的, 构成一个或者多个的字符, 被称作字符类, 字符类在进行匹配这个动作的时候, 要是并没有指定量词呢, 那就只会匹配其中的一个字符了。
-
字符类内可以指定范围,比如
a-zA-Z0-9
表示a到z,A到Z,0到9之间的任何一个字符
-
左方括号后面跟着一个^, 这意味着否定一个字符类, 举例来说, 它能够匹配一个任意的非数字字符, 这样来表示。
-
除了\以外, 字符类内部当中, 其他的特殊字符都不再拥有特殊意义, 而是全都表示字面值, ^要是放在第一个位置就表示否定, 若放在别的位置那就表示^本身,如果-放在中间则表示范围, 当放在字符类里的第一个字符时, 那就表示-本身。
-
字符类内部可以使用速记法,比如\d \s \w
3 速记法
假如存在re.标志, 那么它能够匹配任意字符, 其中包含换行符, 而若没有该标志, 它可以匹配除换行符之外的任何字符, 标点符号。
\d 匹配一个数字,如果带re.ASCII,则匹配0-9
\D 匹配非数字
\s进行空白匹配时, 若带有re.ASCII, 那么它会匹配\t, 或\n, 或者\r, 又或者\f, 还或者\v中的一个。
\S 匹配非空白
\w 匹配单词字符,如果带有re.ascii,则匹配
a-zA-Z0-9_
中的一个
\W 匹配非单子字符
1.2 量词
-
? 匹配前面的字符0次或1次
-
* 匹配前面的字符0次或多次
-
- 匹配前面的字符1次或者多次
-
{m} 匹配前面表达式m次
-
{m,} 匹配前面表达式至少m次
-
{,n} 匹配前面的正则表达式最多n次
-
{m,n} 匹配前面的正则表达式至少m次,最多n次
注意点:
若要尽可能多匹配, 之前的那些量词所呈现为贪婪模式, 要是想改成非贪婪模式, 借助在量词之后跟着一个?来达成实现效果。
1.3 组与捕获
1 ()的作用:
-
将捕获的, 中正则表达式里的内容, 留作进一步利用处理时用, 能够借由在左括号之后跟着?:的方式, 把这个括号的捕获功能给关闭掉。
-
将正则表达式的一部分内容进行组合,以便使用量词或者|
2 反响引用前面()内捕获的内容:
- 通过组号反向引用
每一个不曾运用?:的小括号, 皆会被分配一个组好, 此组好起始于1, 沿从左至右的方向递增, 借助于\i能够引用先前()之内表达式所捕获的内容。
- 通过组名反向引用前面小括号内捕获的内容
能借助在左括号的后边跟着?P, 且在尖括号里头放置组名的方式, 给一个组取上一个别名, 其后经由(?P=name)去引用之前捕获的内容。就像是(? P\w+)\s+(?P=word)这样来匹配重复的单词。
3 注意点:
反向引用不能放在字符类中使用。
1.4 断言与标记
断言不会匹配任何文本,只是对断言所在的文本施加某些约束
1 常用断言:
-
\b 匹配单词的边界,放在字符类中则表示
-
\B 匹配非单词边界,受ASCII标记影响
-
\A 在起始处匹配
-
^ 在起始处匹配,如果有标志,则在每个换行符后匹配
-
\Z 在结尾处匹配
-
$ 在结尾处匹配,如果有标志,则在每个换行符前匹配
-
(?=e) 正前瞻
-
(?!e) 负前瞻
-
你提供的内容似乎不太完整且表意模糊, 不太明确具体要怎么改写。请补充或明确一下准确的需求。
先来看看前瞻, 是这样的情况, exp1后面跟着的内容, 得去匹配exp2才行。
负向前瞻: exp1, 其后面跟着的内容不能够与exp2相匹配的情况, 是(?!exp2) , 有这样一种规定。
关于后顾, 需注意, 负后顾: 比如, 我们要查找hello, 然而hello之后必须是world, 正则表达式能够这样进行编写: "(hello)\s+(?=world)" , 用于匹配含有"hello"以及"hello world"的情况, 不过只能匹配到后者中的hello。
1.5 条件匹配
与id呼应的子表达式, 要是于某情况下符合那种匹配到内容的状况, 在此处就会有那种与之对应的匹配, 不然的话, 就会出现另外情形的匹配。
1.6 正则表达式的标志
-
正则表达式的标志有两种使用方法
-
依靠于把标志参数传进方法, 采用多个标志利用|去加以分割的这般举措, 好比pile(r"#{6}\b", re.|re.)。
-
借助在正则表达式之前增添(?标志)这种方式, 来为正则表达式添加标识, 像(?ms)#{6}\b , 如此这般。
-
常用的标志
re.A, 或者re.ASCII, 会让\b、\B、\s、\S、\w、\W、\d、\D把字符串设定为设定字符串为ASCII。
re.I或者re. 使正则表达式忽略大小写
re.M, 或者re., 进行多行匹配, 致使每一个^在每一回车之后, 每一个$在每一回车之前进行匹配。
re.S或者re. 使.能匹配任意字符,包括回车
将正则表达式中的re.X或者re. 用于设置, 方可在正则表达式跨越多行, 于设置时能添加注释, 可是空白需用\s或者来进行表示, 原因在于默认的空白不再予以解释。像这样。
pile(r"""
*? #不是src的属性
src= #src属性的开始
(?P) #左引号
(?P+?) #图片名字
(?P=quote) #右括号
""",re.|re.)
- 正则表达式模块
2.1 正则表达式处理字符串主要有四大功能
3.14.2
3.14.2是编程语言于2025年12月5日发布的稳定版本, 它属于3.14众多系列里的第二个维护更新, 这个版本有18项修复, 着重解决了多进程、数据类以及正则表达式等模块的回归问题, 还修复了CVE - 2025 - 12084等安全漏洞, 此版本意味着自由线程模式(移除GIL)正式得到官方支持, 是发展进程中的重要里程碑。
下载
-
验证, 去瞅一瞅一个字符串是不是契合正则表达式的语法规则, 通常给出true或者false这两种结果。
-
获取 正则表达式来提取字符串中符合要求的文本
-
把查找到的, 在字符串里符合正则表达式的文本进行替换, 用对应的字符串去把它替换掉。
-
分割 使用正则表达式对字符串进行分割。
2.2 中re模块使用正则表达式的两种方法
-
依靠pile(r, f)方式去生成正则表达式对象, 接着去调用正则表达式对象的相关方法。这般做法的益处是生成正则对象以后能够多次予以使用。
-
re模块里, 针对正则表达式对象的各个对象方法, 都存在一个对应的模块方法, 仅有的不同之处在于, 传入的首个参数是正则表达式字符串。这种方法适用于仅使用一回的正则表达式。
2.3 正则表达式对象的常用方法
- rx.(s,start, end):
要是正则表达式之中不存在分组, 那么就返回一个列表, 而这个列表里所包含的是全部匹配的内容。
要是正则表达式里存在分组, 那么列表之中的每一个元素便是一个元组, 元组里头含有子分组里匹配到的内容, 只是并未返回整个正则表达式匹配的内容。
- rx.(s, start, end):
返回一个可迭代对象
迭代可进行迭代的对象, 每次返回一个匹配所得对象, 此对象调用 group()方法能查看指定组匹配到的内容, 0代表整个正则表达式匹配到的内容。
- rx.(s, start, end):
返回一个匹配对象,倘若没匹配到,就返回None
方法只匹配一次就停止,不会继续往后匹配
- rx.match(s, start, end):
假设正则表达式处于字符串起始位置匹配成功, 那么会返回一个匹配对象, 反之若是未成功匹配, 在这种状况下则会返回None。
- rx.sub(x, s, m):
模块方法re.sub(r, x, s, m)里的x能够采用一个函数, 在此种情况下, 对于捕获到的内容, 我们能够借助这个函数开展处理, 之后再去替换匹配到的文本。
- rx.subn(x, s, m):
和re.sub()方法是一样的, 不过存在区别, 其区别在于返回的是二元组, 在这个二元组里, 有一项是结果字符串, 还有一项是做替换的个数。
- rx.split(s, m):分割字符串
返回一个列表
用正则表达式匹配到的内容对字符串进行分割
如若正则表达式里存有分组, 那么便将分组所匹配到的内容置于列表里每两个分割的之间当作列表的一部分, 就像这样:
rx = pile(r"(\d)+(\d)")
s = ""
= rx.split(s)
返回
-
rx.flags():正则表达式编译时设置的标志
-
rx.():正则表达式编译时使用的字符串
2.4 匹配对象的属性与方法
- m.group(g, ...)
返回编号匹配到的内容或者组名匹配到的内容默认或者0表示整个表达式匹配到的内容如果指定多个则要返回一个元组。
- m.()
返还出来一个字典, 该字典当中, 键是所有被命名的组的组名, 而值是被命名组捕获得到的内容。
如果有参数,则将其作为那些没有参与匹配的组的默认值。
- m.()
返回的是一个元组, 它包含着所有捕获到内容的子分组, 这些子分组从1开始计数, 要是指定了值, 那么这个值就会作为那些没有捕获到内容的组的值。
- m.()
若是匹配到了内容里编号处于最高位置的, 捕获组带有名称, 那般要得返回此名称的;要是并没有名称存在, 或者压根就没使用名称, 那就得返回None哦(这种情况可不常见呢)。
- m.()
存在这样一种情况, 若能匹配得出内容, 那么去找出其中编号最高的捕获组的编号, 要是无法匹配到内容, 那就返回None。
- m.start(g):
此时此刻, 所匹配的对象之中的子分组开始进行匹配的位置是在字符串的哪一个地方, 要是当前的组并未参与到匹配的过程当中, 那么返回的结果就是 -1 。