当前位置:

首页 > 编程开发 > Python中re模块的元字符怎么使用?

Python中re模块的元字符怎么使用?

ReNamer
ReNamer

ReNamer 是一款中文功能批量重命名工具,支持多种定制规则,轻松重命名文件。它更贴近日常 Windows 使用场景,处理高频操作时整体会更顺手一些。

立即下载
¥101.5 ¥145
Windows 2026-08-22
正版软件 Windows

元字符(MetaCharacters)是正则表达式中具有特殊意义的专用字符,在Python中也不例外,是用来指明前导字符(位于元字符前的字符)在目标对象中的出现模式。在正则表达式中,方括号([])中指定的一组字符组成一个字符类。#元字符序列匹配类中的任何单个字符>>>s='foo123bar'#3个任意连续字符匹配>>>re.search('[0-9][0-9][0-9]',s)>>>re.search('[0-9][0-9][0-9]','foo4

本文目录

    元字符(Meta Characters)是正则表达式中具有特殊意义的专用字符,在Python中也不例外,是用来指明前导字符(位于元字符前的字符)在目标对象中的出现模式。

    在正则表达式中,方括号 ( [] ) 中指定的一组字符组成一个字符类。

    # 元字符序列匹配类中的任何单个字符
    >>> s = 'foo123bar'
    
    # 3个任意连续字符匹配
    >>> re.search('[0-9][0-9][0-9]', s)
    <_sre.SRE_Match object; span=(3, 6), match='123'>
    
    >>> re.search('[0-9][0-9][0-9]', 'foo456bar')
    <_sre.SRE_Match object; span=(3, 6), match='456'>
    
    >>> re.search('[0-9][0-9][0-9]', '234baz')
    <_sre.SRE_Match object; span=(0, 3), match='234'>
    
    >>> re.search('[0-9][0-9][0-9]', 'qux678')
    <_sre.SRE_Match object; span=(3, 6), match='678'>
    
    # 匹配不上的情况
    >>> print(re.search('[0-9][0-9][0-9]', '12foo34'))
    None

    通配符点 ( . ) 元字符匹配除换行符以外的任何字符。

    >>> s = 'foo123bar'
    >>> re.search('1.3', s)
    <_sre.SRE_Match object; span=(3, 6), match='123'>
    
    >>> s = 'foo13bar'
    >>> print(re.search('1.3', s))
    None

    re模块支持的元字符

    Python中re模块的元字符怎么使用?

    下面列表都是元字符的描述,对元字符进行分类描述方便记忆。 这个要是看不懂直接看跳过看下面的例子。

    字符描述
    \将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,‘n’ 匹配字符 “n”。‘\n’ 匹配一个换行符。序列 ‘\’ 匹配 “” 而 “(” 则匹配 “(”。
    ^匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。
    $匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。
    *匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。
    +匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
    ?匹配前面的子表达式零次或一次。例如,“do(es)?” 可以匹配 “do” 或 “does” 。? 等价于 {0,1}。
    {n}n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
    {n,}n 是一个非负整数。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。‘o{1,}’ 等价于 ‘o+’。‘o{0,}’ 则等价于 ‘o*’。
    {n,m}m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,“o{1,3}” 将匹配 “fooooood” 中的前三个 o。‘o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。
    ?当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 “oooo”,‘o+?’ 将匹配单个 “o”,而 ‘o+’ 将匹配所有 ‘o’。
    .匹配除换行符(\n、\r)之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用像"(.
    x|y匹配 x 或 y。例如,'z
    [xyz]字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。
    [^xyz]负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’、‘l’、‘i’、‘n’。
    [a-z]字符范围。匹配指定范围内的任意字符。例如,‘[a-z]’ 可以匹配 ‘a’ 到 ‘z’ 范围内的任意小写字母字符。
    [^a-z]负值字符范围。匹配任何不在指定范围内的任意字符。例如,‘[^a-z]’ 可以匹配任何不在 ‘a’ 到 ‘z’ 范围内的任意字符。
    \b匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。
    \B匹配非单词边界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。
    \cx匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。
    \d匹配一个数字字符。等价于 [0-9]。
    \D匹配一个非数字字符。等价于 [^0-9]。
    \f匹配一个换页符。等价于 \x0c 和 \cL。
    \n匹配一个换行符。等价于 \x0a 和 \cJ。
    \r匹配一个回车符。等价于 \x0d 和 \cM。
    \s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
    \S匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
    \t匹配一个制表符。等价于 \x09 和 \cI。
    \v匹配一个垂直制表符。等价于 \x0b 和 \cK。
    \w匹配字母、数字、下划线。等价于’[A-Za-z0-9_]'。
    \W匹配非字母、数字、下划线。等价于 ‘[^A-Za-z0-9_]’。
    \xn匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,‘\x41’ 匹配 “A”。‘\x041’ 则等价于 ‘\x04’ & “1”。正则表达式中可以使用 ASCII 编码。
    \num匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,‘(.)\1’ 匹配两个连续的相同字符。
    \n标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
    \nm标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
    \nml如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
    \un匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。

    类别1:匹配单个字符的元字符

    方括号( [] ) 字符集

    指定要匹配的特定字符集。 字符类元字符序列将匹配该类中包含的任何单个字符。

    # 元字符序列[artz]匹配任何单个'a'、'r'、't'或'z'字符
    # ba[artz]同时匹配'bar'and 'baz'(也将匹配'baa'and 'bat')。
    >>> re.search('ba[artz]', 'foobarqux')
    <_sre.SRE_Match object; span=(3, 6), match='bar'>
    >>> re.search('ba[artz]', 'foobazqux')
    <_sre.SRE_Match object; span=(3, 6), match='baz'>

    匹配和[a-z]之间的任何小写字母字符。

    >>> re.search('[a-z]', 'FOObar')
    <_sre.SRE_Match object; span=(3, 4), match='b'>

    匹配和[0-9]之间任何数字字符。

    >>> re.search('[0-9][0-9]', 'foo123bar')
    <_sre.SRE_Match object; span=(3, 5), match='12'>

    [0-9a-fA-F]匹配任何十六进制数字字符。

    >>> re.search('[0-9a-fA-f]', '--- a0 ---')
    <_sre.SRE_Match object; span=(4, 5), match='a'>

    [^0-9]匹配任何不是数字的字符开头的字符。

    >>> re.search('[^0-9]', '12345foo')
    <_sre.SRE_Match object; span=(5, 6), match='f'>

    如果一个^字符出现在字符类中但不是第一个字符则无结果。

    >>> re.search('[#:^]', 'foo^bar:baz#qux')
    <_sre.SRE_Match object; span=(3, 4), match='^'>

    可以通过用连字符分隔字符来指定字符类中的字符范围,可以将其作为第一个或最后一个字符放置,或者使用反斜杠 ( \ ) 对其进行转义。

    # 直接查找符号
    >>> re.search('[-abc]', '123-456')
    <_sre.SRE_Match object; span=(3, 4), match='-'>
    >>> re.search('[abc-]', '123-456')
    <_sre.SRE_Match object; span=(3, 4), match='-'>
    >>> re.search('[ab\-c]', '123-456')
    <_sre.SRE_Match object; span=(3, 4), match='-'>
    
    
    # 查找转义符号
    >>> re.search('[]]', 'foo[1]')
    <_sre.SRE_Match object; span=(5, 6), match=']'>
    >>> re.search('[ab\]cd]', 'foo[1]')
    <_sre.SRE_Match object; span=(5, 6), match=']'>
    
    
    # [ ] 内的元字符失去意义转义成字符处理
    >>> re.search('[)*+|]', '123*456')
    <_sre.SRE_Match object; span=(3, 4), match='*'>
    >>> re.search('[)*+|]', '123+456')
    <_sre.SRE_Match object; span=(3, 4), match='+'>

    点 ( . ) 通配符

    匹配除换行符以外的任何单个字符。

    >>> re.search('foo.bar', 'fooxbar')
    <_sre.SRE_Match object; span=(0, 7), match='fooxbar'>
    >>> print(re.search('foo.bar', 'foobar'))
    None
    >>> print(re.search('foo.bar', 'foo\nbar'))
    None
    >>> print(re.search('foo.bar', 'foosbar'))
    <_sre.SRE_Match object; span=(0, 7), match='foosbar'>

    \w 和 \W 单词字符匹配

    \w匹配任何字母数字字符,单词字符是大写和小写字母、数字和下划线 ( _) 字符。

    \w 等于 [a-zA-Z0-9_] 。

    >>> re.search('\w', '#(.a$@&')
    <_sre.SRE_Match object; span=(3, 4), match='a'>
    >>> re.search('[a-zA-Z0-9_]', '#(.a$@&')
    <_sre.SRE_Match object; span=(3, 4), match='a'>

    \W是相反的。它匹配任何非单词字符。

    \W 等于 [^a-zA-Z0-9_] 。

    >>> re.search('\W', 'a_1*3Qb')
    <_sre.SRE_Match object; span=(3, 4), match='*'>
    >>> re.search('[^a-zA-Z0-9_]', 'a_1*3Qb')
    <_sre.SRE_Match object; span=(3, 4), match='*'>

    \d 和 \D 字符十进制数字匹配

    \d匹配任何十进制数字字符,等价于[0-9]。

    >>> re.search('\d', 'abc4def')
    <_sre.SRE_Match object; span=(3, 4), match='4'>

    \D匹配任何不是十进制数字的字符,等价于[^0-9]。

    >>> re.search('\D', '234Q678')
    <_sre.SRE_Match object; span=(3, 4), match='Q'>

    \s 和 \S 字符空格匹配

    \s匹配任何空白字符,同时也匹配换行符。

    >>> re.search('\s', 'foo\nbar baz')
    <_sre.SRE_Match object; span=(3, 4), match='\n'>

    \S匹配任何不是空格的字符。

    >>> re.search('\S', '  \n foo  \n  ')
    <_sre.SRE_Match object; span=(4, 5), match='f'>

    混合使用 \w, \W, \d, \D, \s, 和\S

    字符类序列\w, \W, \d, \D, \s, 和\S也可以出现在方括号字符类中。

    # [\d\w\s]匹配任何数字、单词或空白字符
    
    >>> re.search('[\d\w\s]', '---3---')
    <_sre.SRE_Match object; span=(3, 4), match='3'>
    >>> re.search('[\d\w\s]', '---a---')
    <_sre.SRE_Match object; span=(3, 4), match='a'>
    >>> re.search('[\d\w\s]', '--- ---')
    <_sre.SRE_Match object; span=(3, 4), match=' '>
    
    # 由于\w包含\d,相同的字符类也可以表示为略短[\w\s]
    >>> re.search('[\w\s]', '---a---')
    <_sre.SRE_Match object; span=(3, 4), match='a'>
    >>> re.search('[\w\s]', '---a---')
    <_sre.SRE_Match object; span=(3, 4), match='a'>
    >>> re.search('[\w\s]', '--- ---')
    <_sre.SRE_Match object; span=(3, 4), match=' '>

    类别2:转义元字符

    反斜杠 ( \ ) 转义元字符

    反斜杠会删除元字符的特殊含义。

    >>> re.search('.', 'foo.bar')
    <_sre.SRE_Match object; span=(0, 1), match='f'>
    
    >>> re.search('\.', 'foo.bar') # 非通配符
    <_sre.SRE_Match object; span=(3, 4), match='.'>
    
    >>> re.search(r'\\', 'foo\bar')
    <_sre.SRE_Match object; span=(3, 4), match='\\'>

    类别3:锚点

    不匹配搜索字符串中的任何实际字符,并且在解析期间它们不使用任何搜索字符串。指示搜索字符串中必须发生匹配的特定位置。

    ^ 和 \A 字符串的开头匹配项

    >>> re.search('^foo', 'foobar')
    <_sre.SRE_Match object; span=(0, 3), match='foo'>
    >>> print(re.search('^foo', 'barfoo'))
    None
    
    >>> re.search('\Afoo', 'foobar')
    <_sre.SRE_Match object; span=(0, 3), match='foo'>
    >>> print(re.search('\Afoo', 'barfoo'))
    None

    $ 和\Z 字符串的结尾匹配项

    >>> re.search('bar$', 'foobar')
    <_sre.SRE_Match object; span=(3, 6), match='bar'>
    >>> print(re.search('bar$', 'barfoo'))
    None
    
    >>> re.search('bar\Z', 'foobar')
    <_sre.SRE_Match object; span=(3, 6), match='bar'>
    >>> print(re.search('bar\Z', 'barfoo'))
    None
    
    # 特殊$也在搜索字符串末尾的单个换行符之前匹配
    >>> re.search('bar$', 'foobar\n')
    <_sre.SRE_Match object; span=(3, 6), match='bar'>

    \b 和 \B 单词匹配

    \b 必须在单词的开头或结尾。

    # 单词开头
    >>> re.search(r'\bbar', 'foo bar')
    <_sre.SRE_Match object; span=(4, 7), match='bar'>
    >>> re.search(r'\bbar', 'foo.bar')
    <_sre.SRE_Match object; span=(4, 7), match='bar'>
    >>> print(re.search(r'\bbar', 'foobar'))
    None
    
    # 单词结尾
    >>> re.search(r'foo\b', 'foo bar')
    <_sre.SRE_Match object; span=(0, 3), match='foo'>
    >>> re.search(r'foo\b', 'foo.bar')
    <_sre.SRE_Match object; span=(0, 3), match='foo'>
    >>> print(re.search(r'foo\b', 'foobar'))
    None
    
    
    # 单词居中
    >>> re.search(r'\bbar\b', 'foo bar baz')
    <_sre.SRE_Match object; span=(4, 7), match='bar'>
    >>> re.search(r'\bbar\b', 'foo(bar)baz')
    <_sre.SRE_Match object; span=(4, 7), match='bar'>
    >>> print(re.search(r'\bbar\b', 'foobarbaz'))
    None

    \B 不能在单词的开头或结尾。

    >>> print(re.search(r'\Bfoo\B', 'foo'))
    None
    >>> print(re.search(r'\Bfoo\B', '.foo.'))
    None
    >>> re.search(r'\Bfoo\B', 'barfoobaz')
    <_sre.SRE_Match object; span=(3, 6), match='foo'>

    类别4:量词

    该部分必须出现多少次才能使匹配成功。

    * 匹配前面的子表达式零次或多次

    >>> re.search('foo-*bar', 'foobar')                 
    <_sre.SRE_Match object; span=(0, 6), match='foobar'>
    >>> re.search('foo-*bar', 'foo-bar')                   
    <_sre.SRE_Match object; span=(0, 7), match='foo-bar'>
    >>> re.search('foo-*bar', 'foo--bar')                
    <_sre.SRE_Match object; span=(0, 8), match='foo--bar'>

    匹配2个字符中全部的内容。

    >>> re.search('foo.*bar', '# foo jklasajk#*(@ bar #')
    <_sre.SRE_Match object; span=(2, 22), match='foo jklasajk#*(@ bar'>

    + 匹配前面的子表达式一次或多次

    >>> print(re.search('foo-+bar', 'foobar'))              
    None
    >>> re.search('foo-+bar', 'foo-bar')                   
    <_sre.SRE_Match object; span=(0, 7), match='foo-bar'>
    >>> re.search('foo-+bar', 'foo--bar')                  
    <_sre.SRE_Match object; span=(0, 8), match='foo--bar'>

    ? 匹配前面的子表达式零次或一次

    >>> re.search('foo-?bar', 'foobar')                    
    <_sre.SRE_Match object; span=(0, 6), match='foobar'>
    >>> re.search('foo-?bar', 'foo-bar')                   
    <_sre.SRE_Match object; span=(0, 7), match='foo-bar'>
    >>> print(re.search('foo-?bar', 'foo--bar'))           
    None

    .*?、+?、?? 最小长度匹配

    加问号则表示为最小长度匹配的懒惰模式。

    ### + 和 +? 代替了 * 和 *?
    
    # .*全匹配贪婪模式
    >>> re.search('<.*>', '%  %')
    <_sre.SRE_Match object; span=(1, 18), match='  '>
    # *? 前一个字符0次或无限次扩展,最小匹配
    >>> re.search('<.*?>', '%  %')
    <_sre.SRE_Match object; span=(1, 6), match=''>
    # .+ 前一个字符1次或无限次扩展,最小匹配
    >>> re.search('<.+>', '%  %')
    <_sre.SRE_Match object; span=(1, 18), match='  '>
    # .+? 前一个字符1次或无限次扩展,最小匹配
    >>> re.search('<.+?>', '%  %')
    <_sre.SRE_Match object; span=(1, 6), match=''>
    
    # ? 匹配懒惰模式
    >>> re.search('ba?', 'baaaa')
    <_sre.SRE_Match object; span=(0, 2), match='ba'>
    # ?? 前一个字符0次或1次扩展,最小匹配
    >>> re.search('ba??', 'baaaa')
    <_sre.SRE_Match object; span=(0, 1), match='b'>

    {m} 完全匹配m次前面元字符的正则表达式。

    >>> print(re.search('x-{3}x', 'x--x'))                
    None
    >>> re.search('x-{3}x', 'x---x')                     
    <_sre.SRE_Match object; span=(0, 5), match='x---x'>
    >>> print(re.search('x-{3}x', 'x----x'))             
    None

    {m,n} 匹配前面正则表达式的任意数量的重复从m到n次

    >>> for i in range(1, 6):
    ...     s = f"x{'-' * i}x"
    ...     print(f'{i}  {s:10}', re.search('x-{2,4}x', s))
    ...
    1  x-x        None
    2  x--x       <_sre.SRE_Match object; span=(0, 4), match='x--x'>
    3  x---x      <_sre.SRE_Match object; span=(0, 5), match='x---x'>
    4  x----x     <_sre.SRE_Match object; span=(0, 6), match='x----x'>
    5  x-----x    None
    正则表达式匹配说明相同语法
    < regex > {,n}任何小于或等于的重复次数n< regex > {0,n}
    < regex > {m,}任何大于或等于的重复次数m----
    < regex > {,}任意次数的重复< regex > {0,} , < regex > *
    >>> re.search('x{}y', 'x{}y')
    <_sre.SRE_Match object; span=(0, 4), match='x{}y'>
    >>> re.search('x{foo}y', 'x{foo}y')
    <_sre.SRE_Match object; span=(0, 7), match='x{foo}y'>
    >>> re.search('x{a:b}y', 'x{a:b}y')
    <_sre.SRE_Match object; span=(0, 7), match='x{a:b}y'>
    >>> re.search('x{1,3,5}y', 'x{1,3,5}y')
    <_sre.SRE_Match object; span=(0, 9), match='x{1,3,5}y'>
    >>> re.search('x{foo,bar}y', 'x{foo,bar}y')
    <_sre.SRE_Match object; span=(0, 11), match='x{foo,bar}y'>

    {m,n}? 只匹配一次

    非贪婪(懒惰)版本 {m,n}。

    >>> re.search('a{3,5}', 'aaaaaaaa')
    <_sre.SRE_Match object; span=(0, 5), match='aaaaa'>
    >>> re.search('a{3,5}?', 'aaaaaaaa')
    <_sre.SRE_Match object; span=(0, 3), match='aaa'>

    类别5:分组构造和反向引用

    分组构造将 Python 中的正则表达式分解为子表达式或组。

    • 分组:一个组代表一个单一的句法实体。附加元字符作为一个单元应用于整个组。

    • 捕获:一些分组结构还捕获与组中的子表达式匹配的搜索字符串部分。可以通过几种不同的机制检索捕获的匹配项。

    (),定义子表达式或组。

    # 括号中的正则表达式仅匹配括号的内容
    >>> re.search('(bar)', 'foo bar baz')
    <_sre.SRE_Match object; span=(4, 7), match='bar'>
    >>> re.search('bar', 'foo bar baz')
    <_sre.SRE_Match object; span=(4, 7), match='bar'>

    将组视为一个单元

    组后面的量词元字符对组中指定的整个子表达式作为一个单元进行操作。

    # 元字符+仅适用于字符'r','ba'随后出现一次或多次'r'。
    >>> re.search('bar+', 'foo bar baz')
    <_sre.SRE_Match object; span=(4, 7), match='bar'>
    >>> re.search('(bar)+', 'foo bar baz')
    <_sre.SRE_Match object; span=(4, 7), match='bar'>
    >>> re.search('(bar)+', 'foo barbar baz')
    <_sre.SRE_Match object; span=(4, 10), match='barbar'>
    >>> re.search('(bar)+', 'foo barbarbarbar baz')
    <_sre.SRE_Match object; span=(4, 16), match='barbarbarbar'>
    正则表达式解释匹配说明例子
    bar+元字符+仅适用于字符’r’。‘ba’随后出现一次或多次’r’bar、barr、barrr等
    (bar)+元字符+适用于整个字符串’bar’。出现一次或多次’bar’bar、barbar、barbarbar

    捕获组,m.groups()

    返回一个元组,其中包含从正则表达式匹配中捕获的所有组。

    >>> m = re.search('(\w+),(\w+),(\w+)', 'foo,quux,baz')
    >>> m
    <_sre.SRE_Match object; span=(0, 12), match='foo:quux:baz'>
    >>> m.groups()
    ('foo', 'quux', 'baz')

    捕获组,m.group()

    返回包含捕获的匹配项的字符串。

    >>> m = re.search('(\w+),(\w+),(\w+)', 'foo,quux,baz')
    >>> m.groups()
    ('foo', 'quux', 'baz')
    >>> m.group(0)
    ('foo', 'quux', 'baz')
    >>> m.group(1)
    'foo'
    >>> m.group(2)
    'quux'
    >>> m.group(3)
    'baz'

    捕获组,m.group(, , …)

    返回一个包含指定捕获匹配序号的元组。

    >>> m = re.search('(\w+),(\w+),(\w+)', 'foo,quux,baz')
    >>> m.groups()
    ('foo', 'quux', 'baz')
    >>> m.group(2, 3)
    ('quux', 'baz')
    >>> m.group(3, 2, 1)
    ('baz', 'quux', 'foo')

    类别6:反向引用

    \ 匹配连续相同字符

    >>> regex = r'(\w+),\1'
    
    >>> m = re.search(regex, 'foo,foo')
    >>> m
    <_sre.SRE_Match object; span=(0, 7), match='foo,foo'>
    >>> m.group(1)
    'foo'
    
    >>> m = re.search(regex, 'qux,qux')
    >>> m
    <_sre.SRE_Match object; span=(0, 7), match='qux,qux'>
    >>> m.group(1)
    'qux'
    
    >>> m = re.search(regex, 'foo,qux')
    >>> print(m)
    None

    类别7:其他分组结构

    (?P) 创建捕获组并命名

    >>> m = re.search('(?P\w+),(?P\w+),(?P\w+)', 'foo,quux,baz')
    >>> m.groups()
    ('foo', 'quux', 'baz')
    
    >>> m.group('w1')
    'foo'
    >>> m.group('w3')
    'baz'
    >>> m.group('w1', 'w2', 'w3')
    ('foo', 'quux', 'baz')
    >>> m.group(1, 2, 3)
    ('foo', 'quux', 'baz')

    (?P=) 匹配先前捕获名的内容

    >>> m = re.search(r'(\w+),\1', 'foo,foo')
    >>> m
    <_sre.SRE_Match object; span=(0, 7), match='foo,foo'>
    >>> m.group(1)
    'foo'
    >>> m = re.search(r'(?P\w+),(?P=word)', 'foo,foo')
    >>> m
    <_sre.SRE_Match object; span=(0, 7), match='foo,foo'>
    >>> m.group('word')
    'foo'

    (?:) 创建一个非捕获组

    >>> m = re.search('(\w+),(?:\w+),(\w+)', 'foo,quux,baz')
    >>> m.groups()
    ('foo', 'baz')
    
    >>> m.group(1)
    'foo'
    >>> m.group(2)
    'baz'

    指定条件匹配

    (?()|)

    (?()|)

    # ^(###)?表示搜索字符串可选地以 . 开头'###'。如果是这样,那么周围的分组括号###将创建一个编号为的组1。否则,不会存在这样的组
    # foo字面上匹配字符串'foo'
    # (?(1)bar|baz)匹配'bar'组是否1存在和'baz'不存在
    regex = r'^(###)?foo(?(1)bar|baz)'
    
    
    # 搜索字符串'###foobar'确实以 开头'###',因此解析器创建了一个编号为 的组1。然后条件匹配是针对'bar'匹配的
    >>> re.search(regex, '###foobar')
    <_sre.SRE_Match object; span=(0, 9), match='###foobar'>
    
    # 搜索字符串'###foobaz'确实以 开头'###',因此解析器创建了一个编号为 的组1。然后条件匹配是反对'bar',不匹配。
    >>> print(re.search(regex, '###foobaz'))
    None
    
    # 搜索字符串'foobar'不以 开头'###',因此没有编号为 的组1。然后条件匹配是反对'baz',不匹配。
    >>> print(re.search(regex, 'foobar'))
    None
    
    # 搜索字符串'foobaz'不以 开头'###',因此没有编号为 的组1。然后条件匹配是针对'baz'匹配的。
    >>> re.search(regex, 'foobaz')
    <_sre.SRE_Match object; span=(0, 6), match='foobaz'>

    类别8:Lookahead 和 Lookbehind 断言

    根据解析器在搜索字符串中当前位置的后面(左侧)或前面(右侧)来确定 Python 中正则表达式匹配的成功或失败。(?=) 积极前瞻断言

    (?=) 积极前瞻断言

    # 断言正则表达式解析器当前位置之后的内容必须匹配
    # 前瞻断言(?=[a-z])指定后面的'foo'必须是小写字母字符。
    >>> re.search('foo(?=[a-z])', 'foobar')
    <_sre.SRE_Match object; span=(0, 3), match='foo'>
    # 前瞻失败的例子,foo的下一个字符是'1'
    >>> print(re.search('foo(?=[a-z])', 'foo123'))
    None
    
    # 前瞻的独特之处在于不消耗搜索字符串中匹配的部分,并且它不是返回的匹配对象的一部分。
    >>> re.search('foo(?=[a-z])', 'foobar')
    <_sre.SRE_Match object; span=(0, 3), match='foo'>
    
    # 举例对比观察,?=断言的区别
    >>> m = re.search('foo(?=[a-z])(?P.)', 'foobar')
    >>> m.group('ch')
    'b'
    >>> m = re.search('foo([a-z])(?P.)', 'foobar')
    >>> m.group('ch')
    'a'

    (?!) 否定的前瞻断言

    # 例子和之前的前瞻积极断言相反
    >>> re.search('foo(?=[a-z])', 'foobar')
    <_sre.SRE_Match object; span=(0, 3), match='foo'>
    >>> print(re.search('foo(?![a-z])', 'foobar'))
    None
    
    >>> print(re.search('foo(?=[a-z])', 'foo123'))
    None
    >>> re.search('foo(?![a-z])', 'foo123')
    <_sre.SRE_Match object; span=(0, 3), match='foo'>

    (?<=) 积极的后向断言

    # 断言正则表达式解析器当前位置之前的内容匹配
    # 断言指定'foo'必须先于'bar'
    >>> re.search('(?<=foo)bar', 'foobar')
    <_sre.SRE_Match object; span=(3, 6), match='bar'>
    >>> print(re.search('(?<=qux)bar', 'foobar'))
    None

    (?) 否定的向后断言

    # 例子和之前的向后积极断言相反
    >>> print(re.search('(?>> re.search('(?

    类别9:杂项元字符

    (?#…) 指定注释

    # 正则表达式解析器忽略(?#...)序列中包含的任何内容
    >>> re.search('bar(?#This is a comment) *baz', 'foo bar baz qux')
    <_sre.SRE_Match object; span=(4, 11), match='bar baz'>

    竖条或管道 ( | ) 指定要匹配的一组备选方案

    # 形式的表达式最多匹配一个指定的表达式:||...|
    >>> re.search('foo|bar|baz', 'bar')
    <_sre.SRE_Match object; span=(0, 3), match='bar'>
    >>> re.search('foo|bar|baz', 'baz')
    <_sre.SRE_Match object; span=(0, 3), match='baz'>
    >>> print(re.search('foo|bar|baz', 'quux'))
    None
    
    # 结合交替、分组和任何其他元字符来实现您需要的任何复杂程度。
    # (foo|bar|baz)+表示一个或多个字符串
    >>> re.search('(foo|bar|baz)+', 'foofoofoo')
    <_sre.SRE_Match object; span=(0, 9), match='foofoofoo'>
    >>> re.search('(foo|bar|baz)+', 'bazbazbazbaz')
    <_sre.SRE_Match object; span=(0, 12), match='bazbazbazbaz'>
    >>> re.search('(foo|bar|baz)+', 'barbazfoo')
    <_sre.SRE_Match object; span=(0, 9), match='barbazfoo'>
    
    # ([0-9]+|[a-f]+)表示一个或多个十进制数字字符的序列或一个或多个'a-f'字符的序列
    >>> re.search('([0-9]+|[a-f]+)', '456')
    <_sre.SRE_Match object; span=(0, 3), match='456'>
    >>> re.search('([0-9]+|[a-f]+)', 'ffda')
    <_sre.SRE_Match object; span=(0, 4), match='ffda'>
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Python
    相关文章 更多
    python删除一个列表里的重复元素的方法与代码示例
    python删除一个列表里的重复元素的方法与代码示例

    学习如何使用Python高效删除列表中的重复元素。本文提供5种常见方法的代码示例,涵盖保持顺序与不保持顺序的场景,适合初学者和进阶开发者参考。

    Python写接口的步骤及完整代码示例
    Python写接口的步骤及完整代码示例

    详细讲解使用Python编写Web接口的核心步骤与完整代码示例,涵盖环境准备、路由定义、数据校验、服务启动及调试测试方法。

    codex怎么读取word文档及docx文件操作教程
    codex怎么读取word文档及docx文件操作教程

    介绍如何利用编程工具读取和解析Word文档(docx格式),涵盖基础文本提取代码示例、结构化数据处理逻辑,以及处理复杂排版时的技术局限与替代方案。

    怎么在Python中调用C语言代码提升性能
    怎么在Python中调用C语言代码提升性能

    详细讲解在Python中调用C语言代码提升性能的完整实践指南,包含原理分析、编译步骤、ctypes与CFFI具体实现、性能对比及常见陷阱。

    Python与C语言的性能差异及底层原理
    Python与C语言的性能差异及底层原理

    深入解析Python与C语言在执行效率上的数量级差异,从编译机制、变量内存布局、动态类型推断到GIL锁,系统阐明底层核心原理。

    Python和C语言哪个更适合编程入门
    Python和C语言哪个更适合编程入门

    客观对比Python与C语言在心智负担、底层机制与学习反馈上的核心差异,提供清晰有据的选择标准与切实的入门学习路径。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

    针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

    langgraph python guide中文入门教程详解
    langgraph python guide中文入门教程详解

    本篇LangGraph Python中文入门教程详解,系统梳理StateGraph状态机定义、节点编写、边与条件路由、检查点持久化(MemorySaver)等核心机制,提供从环境安装到完整循环智能体构建的代码示例与实操指导。

    Windows 安装 Python:从官方入口到虚拟环境的可复现实践
    Windows 安装 Python:从官方入口到虚拟环境的可复现实践

    面向后端开发者,基于 Python 官方文档说明如何在 Windows 上安装 Python、创建 venv 虚拟环境及使用 pip 管理依赖。包含可复制命令、验证方法及工具选择边界,避免常见配置误区。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

    即将离开本站
    您即将前往第三方网站,请确认是否继续?