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