Python 3 - 正则表达式

  • 简述

    正则表达式是一种特殊的字符序列,可帮助您使用模式中包含的专用语法匹配或查找其他字符串或字符串集。正则表达式在 UNIX 世界中被广泛使用。
    模组re在 Python 中提供对类似 Perl 的正则表达式的全面支持。这re模块引发异常re.error如果在编译或使用正则表达式时发生错误。
    我们将介绍两个重要的函数,它们将用于处理正则表达式。尽管如此,首先要注意一件小事:有各种各样的字符,当它们用于正则表达式时会有特殊的含义。为了避免在处理正则表达式时出现任何混淆,我们将使用原始字符串作为r'expression'.

    匹配单个字符的基本模式

    序号 表达与匹配
    1
    a, X, 9, <
    普通字符只是完全匹配自己。
    2
    . (a period)
    匹配除换行符 '\n' 之外的任何单个字符
    3
    \w
    匹配“单词”字符:字母或数字或下划线 [a-zA-Z0-9_]。
    4
    \W
    匹配任何非单词字符。
    5
    \b
    词与非词的边界
    6
    \s
    匹配单个空白字符——空格、换行符、回车符、制表符
    7
    \S
    匹配任何非空白字符。
    8
    \t, \n, \r
    制表符、换行符、返回
    9
    \d
    十进制数字 [0-9]
    10
    ^
    匹配字符串的开头
    11
    $
    匹配字符串的结尾
    12
    \
    抑制角色的“特殊性”。

    编译标志

    编译标志允许您修改正则表达式工作方式的某些方面。标志在 re 模块中有两个名称,一个长名称如IGNORECASE和一个简短的单字母形式,例如 I。
    序号 旗帜与意义
    1
    ASCII, A
    使多个转义符如 \w、\b、\s 和 \d 仅匹配具有相应属性的 ASCII 字符。
    2
    DOTALL, S
    制作,匹配任何字符,包括换行符
    3
    IGNORECASE, I
    进行不区分大小写的匹配
    4
    LOCALE, L
    进行语言环境感知匹配
    5
    MULTILINE, M
    多行匹配,影响^和$
    6
    VERBOSE, X (for ‘extended’)
    启用冗长的 RE,可以将其组织得更清晰、更易于理解
  • 匹配函数

    此函数尝试将 RE模式与带有可选标志的字符串匹配。
    这是此函数的语法 -
    
    re.match(pattern, string, flags = 0)
    
    这是参数的描述 -
    序号 参数说明
    1
    pattern
    这是要匹配的正则表达式。
    2
    string
    这是字符串,将搜索它以匹配字符串开头的模式。
    3
    flags
    您可以使用按位或 (|) 指定不同的标志。这些是修饰符,列在下表中。
    re.match函数返回一个match反对成功,None失败时。我们使用group(num)groups()函数match对象以获得匹配的表达式。
    序号 匹配对象方法和说明
    1
    group(num = 0)
    此方法返回整个匹配项(或特定子组编号)
    2
    groups()
    此方法返回元组中所有匹配的子组(如果没有则为空)

    例子

    
    #!/usr/bin/python3
    import re
    line = "Cats are smarter than dogs"
    matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
    if matchObj:
       print ("matchObj.group() : ", matchObj.group())
       print ("matchObj.group(1) : ", matchObj.group(1))
       print ("matchObj.group(2) : ", matchObj.group(2))
    else:
       print ("No match!!")
    
    执行上述代码时,会产生以下结果 -
    
    matchObj.group() :  Cats are smarter than dogs
    matchObj.group(1) :  Cats
    matchObj.group(2) :  smarter
    
  • 搜索功能

    此函数使用可选标志搜索字符串中第一次出现的 RE模式
    这是此函数的语法 -
    
    re.search(pattern, string, flags = 0)
    
    这是参数的描述 -
    序号 参数说明
    1
    pattern
    这是要匹配的正则表达式。
    2
    string
    这是字符串,将搜索该字符串以匹配字符串中任何位置的模式。
    3
    flags
    您可以使用按位或 (|) 指定不同的标志。这些是修饰符,列在下表中。
    re.search函数返回一个match反对成功,none失败时。我们使用group(num)groups()函数match对象以获取匹配的表达式。
    序号 匹配对象方法和说明
    1
    group(num = 0)
    此方法返回整个匹配项(或特定子组编号)
    2
    groups()
    此方法返回元组中所有匹配的子组(如果没有则为空)

    例子

    
    #!/usr/bin/python3
    import re
    line = "Cats are smarter than dogs";
    searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
    if searchObj:
       print ("searchObj.group() : ", searchObj.group())
       print ("searchObj.group(1) : ", searchObj.group(1))
       print ("searchObj.group(2) : ", searchObj.group(2))
    else:
       print ("Nothing found!!")
    
    执行上述代码时,会产生以下结果 -
    
    matchObj.group() :  Cats are smarter than dogs
    matchObj.group(1) :  Cats
    matchObj.group(2) :  smarter
    
  • 匹配与搜索

    Python 提供了两种不同的基于正则表达式的原始操作:match仅在字符串的开头检查匹配项,而search检查字符串中的任何位置是否匹配(这是 Perl 默认情况下所做的)。

    例子

    
    #!/usr/bin/python3
    import re
    line = "Cats are smarter than dogs";
    matchObj = re.match( r'dogs', line, re.M|re.I)
    if matchObj:
       print ("match --> matchObj.group() : ", matchObj.group())
    else:
       print ("No match!!")
    searchObj = re.search( r'dogs', line, re.M|re.I)
    if searchObj:
       print ("search --> searchObj.group() : ", searchObj.group())
    else:
       print ("Nothing found!!")
    
    执行上述代码时,会产生以下结果 -
    
    No match!!
    search --> matchObj.group() :  dogs
    
  • 搜索和替换

    最重要的之一re使用正则表达式的方法是sub.

    句法

    
    re.sub(pattern, repl, string, max=0)
    
    此方法将string中所有出现的 RE模式替换为repl,替换所有出现,除非提供了max。此方法返回修改后的字符串。

    例子

    
    #!/usr/bin/python3
    import re
    phone = "2004-959-559 # This is Phone Number"
    # Delete Python-style comments
    num = re.sub(r'#.*
    
    执行上述代码时,会产生以下结果 -
    
    Phone Num :  2004-959-559
    Phone Num :  2004959559
    
  • 正则表达式修饰符:选项标志

    正则表达式文字可能包括一个可选的修饰符来控制匹配的各个方面。修饰符被指定为可选标志。您可以使用异或 (|) 提供多个修饰符,如前所示,并且可以由其中之一表示 -
    序号 修饰符和说明
    1
    re.I
    执行不区分大小写的匹配。
    2
    re.L
    根据当前语言环境解释单词。这种解释会影响字母组(\w 和 \W)以及单词边界行为(\b 和 \B)。
    3
    re.M
    使 $ 匹配行的结尾(不仅仅是字符串的结尾)并使 ^ 匹配任何行的开头(而不仅仅是字符串的开头)。
    4
    re.S
    使句点(点)匹配任何字符,包括换行符。
    5
    re.U
    根据 Unicode 字符集解释字母。此标志影响 \w、\W、\b、\B 的行为。
    6
    re.X
    允许“更可爱”的正则表达式语法。它忽略空格(集合 [] 内或被反斜杠转义时除外)并将未转义的 # 视为注释标记。
  • 正则表达式模式

    除了控制字符,(+ ? . * ^ $ ( ) [ ] { } | \), 所有字符匹配自己。您可以通过在控制字符前加上反斜杠来转义控制字符。
    下表列出了 Python 中可用的正则表达式语法 -
  • 正则表达式示例

    文字字符

    序号 示例和说明
    1
    python
    匹配“python”。
  • 字符类

    序号 示例和说明
    1
    [Pp]ython
    匹配“Python”或“python”
    2
    rub[ye]
    匹配“ruby”或“rube”
    3
    [aeiou]
    匹配任何一个小写元音
    4
    [0-9]
    匹配任意数字;与 [0123456789] 相同
    5
    [a-z]
    匹配任何小写 ASCII 字母
    6
    [A-Z]
    匹配任何大写 ASCII 字母
    7
    [a-zA-Z0-9]
    符合以上任何一项
    8
    [^aeiou]
    匹配小写元音以外的任何内容
    9
    [^0-9]
    匹配数字以外的任何内容
  • 特殊字符类

    序号 示例和说明
    1
    .
    匹配除换行符以外的任何字符
    2
    \d
    匹配数字:[0-9]
    3
    \D
    匹配一个非数字:[^0-9]
    4
    \s
    匹配空白字符:[ \t\r\n\f]
    5
    \S
    匹配非空白:[^ \t\r\n\f]
    6
    \w
    匹配单个单词字符:[A-Za-z0-9_]
    7
    \W
    匹配一个非单词字符:[^A-Za-z0-9_]
  • 重复案例

    序号 示例和说明
    1
    ruby?
    匹配“rub”或“ruby”:y 是可选的
    2
    ruby*
    匹配“rub”加0个或多个ys
    3
    ruby+
    匹配 "rub" 加上 1 个或多个 ys
    4
    \d{3}
    正好匹配 3 个数字
    5
    \d{3,}
    匹配 3 个或更多数字
    6
    \d{3,5}
    匹配 3、4 或 5 位数字
  • 非贪婪重复

    这匹配最少的重复次数 -
    序号 示例和说明
    1
    <.*>
    贪婪重复:匹配“<python>perl>”
    2
    <.*?>
    Nongreedy:匹配“<python>perl>”中的“<python>”
  • 用括号分组

    序号 示例和说明
    1
    \D\d+
    无组:+ 重复 \d
    2
    (\D\d)+
    分组:+ 重复 \D\d 对
    3
    ([Pp]ython(,)?)+
    匹配“Python”、“Python, python, python”等。
  • 反向引用

    这再次匹配先前匹配的组 -
    序号 示例和说明
    1
    ([Pp])ython&\1ails
    匹配 python&pails 或 Python&Pails
    2
    (['"])[^\1]*\1
    单引号或双引号字符串。\1 匹配第一组匹配的任何内容。\2 匹配第二组匹配的任何内容,等等。
  • 备择方案

    序号 示例和说明
    1
    python|perl
    匹配“python”或“perl”
    2
    rub(y|le)
    匹配“红宝石”或“卢布”
    3
    Python(!+|\?)
    “Python”后跟一个或多个!还是一个?
  • 锚点

    这需要指定匹配位置。
    序号 示例和说明
    1
    ^Python
    在字符串或内部行的开头匹配“Python”
    2
    Python$
    在字符串或行的末尾匹配“Python”
    3
    \APython
    在字符串的开头匹配“Python”
    4
    Python\Z
    匹配字符串末尾的“Python”
    5
    \bPython\b
    在单词边界处匹配“Python”
    6
    \brub\B
    \B 是非词边界:匹配“rube”和“ruby”中的“rub”但不是单独匹配
    7
    Python(?=!)
    如果后跟感叹号,则匹配“Python”。
    8
    Python(?!!)
    如果后面没有感叹号,则匹配“Python”。
  • 带括号的特殊语法

    序号 示例和说明
    1
    R(?#comment)
    匹配“R”。剩下的都是comment
    2
    R(?i)uby
    匹配“uby”时不区分大小写
    3
    R(?i:uby)
    同上
    4
    rub(?:y|le))
    仅分组而不创建 \1 反向引用
, "", phone) print ("Phone Num : ", num) # Remove anything other than digits num = re.sub(r'\D', "", phone) print ("Phone Num : ", num)
执行上述代码时,会产生以下结果 -

                      
  • 正则表达式修饰符:选项标志

    正则表达式文字可能包括一个可选的修饰符来控制匹配的各个方面。修饰符被指定为可选标志。您可以使用异或 (|) 提供多个修饰符,如前所示,并且可以由其中之一表示 -
    序号 修饰符和说明
    1
    re.I
    执行不区分大小写的匹配。
    2
    re.L
    根据当前语言环境解释单词。这种解释会影响字母组(\w 和 \W)以及单词边界行为(\b 和 \B)。
    3
    re.M
    使 $ 匹配行的结尾(不仅仅是字符串的结尾)并使 ^ 匹配任何行的开头(而不仅仅是字符串的开头)。
    4
    re.S
    使句点(点)匹配任何字符,包括换行符。
    5
    re.U
    根据 Unicode 字符集解释字母。此标志影响 \w、\W、\b、\B 的行为。
    6
    re.X
    允许“更可爱”的正则表达式语法。它忽略空格(集合 [] 内或被反斜杠转义时除外)并将未转义的 # 视为注释标记。
  • 正则表达式模式

    除了控制字符,(+ ? . * ^ $ ( ) [ ] { } | \), 所有字符匹配自己。您可以通过在控制字符前加上反斜杠来转义控制字符。
    下表列出了 Python 中可用的正则表达式语法 -
  • 正则表达式示例

    文字字符

    序号 示例和说明
    1
    python
    匹配“python”。
  • 字符类

    序号 示例和说明
    1
    [Pp]ython
    匹配“Python”或“python”
    2
    rub[ye]
    匹配“ruby”或“rube”
    3
    [aeiou]
    匹配任何一个小写元音
    4
    [0-9]
    匹配任意数字;与 [0123456789] 相同
    5
    [a-z]
    匹配任何小写 ASCII 字母
    6
    [A-Z]
    匹配任何大写 ASCII 字母
    7
    [a-zA-Z0-9]
    符合以上任何一项
    8
    [^aeiou]
    匹配小写元音以外的任何内容
    9
    [^0-9]
    匹配数字以外的任何内容
  • 特殊字符类

    序号 示例和说明
    1
    .
    匹配除换行符以外的任何字符
    2
    \d
    匹配数字:[0-9]
    3
    \D
    匹配一个非数字:[^0-9]
    4
    \s
    匹配空白字符:[ \t\r\n\f]
    5
    \S
    匹配非空白:[^ \t\r\n\f]
    6
    \w
    匹配单个单词字符:[A-Za-z0-9_]
    7
    \W
    匹配一个非单词字符:[^A-Za-z0-9_]
  • 重复案例

    序号 示例和说明
    1
    ruby?
    匹配“rub”或“ruby”:y 是可选的
    2
    ruby*
    匹配“rub”加0个或多个ys
    3
    ruby+
    匹配 "rub" 加上 1 个或多个 ys
    4
    \d{3}
    正好匹配 3 个数字
    5
    \d{3,}
    匹配 3 个或更多数字
    6
    \d{3,5}
    匹配 3、4 或 5 位数字
  • 非贪婪重复

    这匹配最少的重复次数 -
    序号 示例和说明
    1
    <.*>
    贪婪重复:匹配“<python>perl>”
    2
    <.*?>
    Nongreedy:匹配“<python>perl>”中的“<python>”
  • 用括号分组

    序号 示例和说明
    1
    \D\d+
    无组:+ 重复 \d
    2
    (\D\d)+
    分组:+ 重复 \D\d 对
    3
    ([Pp]ython(,)?)+
    匹配“Python”、“Python, python, python”等。
  • 反向引用

    这再次匹配先前匹配的组 -
    序号 示例和说明
    1
    ([Pp])ython&\1ails
    匹配 python&pails 或 Python&Pails
    2
    (['"])[^\1]*\1
    单引号或双引号字符串。\1 匹配第一组匹配的任何内容。\2 匹配第二组匹配的任何内容,等等。
  • 备择方案

    序号 示例和说明
    1
    python|perl
    匹配“python”或“perl”
    2
    rub(y|le)
    匹配“红宝石”或“卢布”
    3
    Python(!+|\?)
    “Python”后跟一个或多个!还是一个?
  • 锚点

    这需要指定匹配位置。
    序号 示例和说明
    1
    ^Python
    在字符串或内部行的开头匹配“Python”
    2
    Python$
    在字符串或行的末尾匹配“Python”
    3
    \APython
    在字符串的开头匹配“Python”
    4
    Python\Z
    匹配字符串末尾的“Python”
    5
    \bPython\b
    在单词边界处匹配“Python”
    6
    \brub\B
    \B 是非词边界:匹配“rube”和“ruby”中的“rub”但不是单独匹配
    7
    Python(?=!)
    如果后跟感叹号,则匹配“Python”。
    8
    Python(?!!)
    如果后面没有感叹号,则匹配“Python”。
  • 带括号的特殊语法

    序号 示例和说明
    1
    R(?#comment)
    匹配“R”。剩下的都是comment
    2
    R(?i)uby
    匹配“uby”时不区分大小写
    3
    R(?i:uby)
    同上
    4
    rub(?:y|le))
    仅分组而不创建 \1 反向引用