Python正则表达式详解

  正则表达式是一个很强大的字符串处理工具,几乎任何关于字符串的操作都可以使用正则表达式来完成,作为一个爬虫工作者,每天和字符串打交道,正则表达式更是不可或缺的技能,正则表达式的在不同的语言中使用方式可能不一样,不过只要学会了任意一门语言的正则表达式用法,其他语言中大部分也只是换了个函数的名称而已,本质都是一样的。下面,我来介绍一下python中的正则表达式是怎么使用的。

  首先,python中的正则表达式大致分为以下几部分:

    1. 元字符
    2. 模式
    3. 函数
    4. re 内置对象用法
    5. 分组用法
    6. 环视用法

  所有关于正则表达式的操作都使用 python 标准库中的 re 模块。

一、元字符 (参见 python 模块 re 文档)

    • .                    匹配任意字符(不包括换行符)
    • ^                    匹配开始位置,多行模式下匹配每一行的开始
    • $                    匹配结束位置,多行模式下匹配每一行的结束
    • *                    匹配前一个元字符0到多次
    • +                    匹配前一个元字符1到多次
    • ?                    匹配前一个元字符0到1次
    • {m,n}                匹配前一个元字符m到n次
    • \\                   转义字符,跟在其后的字符将失去作为特殊元字符的含义,例如\\.只能匹配.,不能再匹配任意字符
    • []                   字符集,一个字符的集合,可匹配其中任意一个字符
    • |                    逻辑表达式 或 ,比如 a|b 代表可匹配 a 或者 b
    • (...)                分组,默认为捕获,即被分组的内容可以被单独取出,默认每个分组有个索引,从 1 开始,按照"("的顺序决定索引值
    • (?iLmsux)            分组中可以设置模式,iLmsux之中的每个字符代表一个模式,用法参见 模式 I
    • (?:...)              分组的不捕获模式,计算索引时会跳过这个分组
    • (?P...)        分组的命名模式,取此分组中的内容时可以使用索引也可以使用name
    • (?P=name)            分组的引用模式,可在同一个正则表达式用引用前面命名过的正则
    • (?#...)              注释,不影响正则表达式其它部分,用法参见 模式 I
    • (?=...)              顺序肯定环视,表示所在位置右侧能够匹配括号内正则
    • (?!...)              顺序否定环视,表示所在位置右侧不能匹配括号内正则
    • (?<=...)             逆序肯定环视,表示所在位置左侧能够匹配括号内正则
    • (?
    • (?(id/name)yes|no)   若前面指定id或name的分区匹配成功则执行yes处的正则,否则执行no处的正则
    • \number              匹配和前面索引为number的分组捕获到的内容一样的字符串
    • \A                   匹配字符串开始位置,忽略多行模式
    • \Z                   匹配字符串结束位置,忽略多行模式
    • \b                   匹配位于单词开始或结束位置的空字符串
    • \B                   匹配不位于单词开始或结束位置的空字符串
    • \d                   匹配一个数字, 相当于 [0-9]
    • \D                   匹配非数字,相当于 [^0-9]
    • \s                   匹配任意空白字符, 相当于 [ \t\n\r\f\v]
    • \S                   匹配非空白字符,相当于 [^ \t\n\r\f\v]
    • \w                   匹配数字、字母、下划线中任意一个字符, 相当于 [a-zA-Z0-9_]
    • \W                   匹配非数字、字母、下划线中的任意字符,相当于 [^a-zA-Z0-9_]

二、模式

    • I    IGNORECASE, 忽略大小写的匹配模式, 样例如下
      s = 'hello World!'
      
      regex = re.compile("hello world!", re.I)
      print regex.match(s).group()
      #output> 'hello World!'
      
      #在正则表达式中指定模式以及注释
      regex = re.compile("(?#注释)(?i)hello world!")
      print regex.match(s).group()
      #output> 'hello World!'
    • L    LOCALE, 字符集本地化。这个功能是为了支持多语言版本的字符集使用环境的,比如在转义符\w,在英文环境下,它代表[a-zA-Z0-9_],即所以英文字符和数字。如果在一个法语环境下使用,缺省设置下,不能匹配"é" 或   "ç"。加上这L选项和就可以匹配了。不过这个对于中文环境似乎没有什么用,它仍然不能匹配中文字符。
    • M    MULTILINE,多行模式, 改变 ^ 和 $ 的行为
      s = '''first line
      second line
      third line'''
      
      # ^
      regex_start = re.compile("^\w+")
      print regex_start.findall(s)
      # output> ['first']
      
      regex_start_m = re.compile("^\w+", re.M)
      print regex_start_m.findall(s)
      # output> ['first', 'second', 'third']
      
      #$
      regex_end = re.compile("\w+$")
      print regex_end.findall(s)
      # output> ['line']
      
      regex_end_m = re.compile("\w+$", re.M)
      print regex_end_m.findall(s)
      # output> ['line', 'line', 'line']
    • S   DOTALL,此模式下 '.' 的匹配不受限制,可匹配任何字符,包括换行符
      s = '''first line
      second line
      third line'''
      #
      regex = re.compile("

你可能感兴趣的:(正则表达式,python,开发语言,深度学习,数据分析)