正则表达式

正则表达式是编程中常用的技术手段,普通的字符串操作会使得程序难以复用,而使用正则表达式会极大的提高复用率。

  1. 匹配符
    要用字符来匹配字符,定义一些基本的的匹配符是不可避免的:
    • \d可以匹配一个数字,\w可以匹配一个字母或者数字,\s 表示匹配空格或者Tab等空白符
    • . 可以匹配任意字符
    • 对于变长匹配,* 表示任意个字符(包括0),+ 表示最少一个字符,? 表示0或者1个字符,{n} 表示匹配n个字符,{n,m} 表示匹配n-m个字符

    例题1. 请分析下 \d{3}\s+\d{3,8} 所表示的含义?
    解:
    \d{3}表示三个数字
    \s+ 表示最少一个空格
    \d{3,8}表示3-8位的数字
    答: 这个正则表达式表示的是一个用空格隔开的电话号码。

  2. 精确匹配
    上述匹配符有一个致命的问题,比如如果我想匹配一个用空格或者 - 分开的电话号码?似乎难以解决这个问题,如果写两个正则表达式十分不优雅,所以我们又引入了以下几个操作符:
    • []表示了范围,如 [0-9a-zA-Z\_] 匹配一个数字、字母或者下划线
    • A|B 表示匹配A或者B,| 表示或者匹配,如 (P|p)ython 匹配Python或者python
    • ^ 表示行的开头,如 **^* 表示以数字开头
    • $ 表示行的结尾,如 $ 表示以数字结尾
  3. 注意事项
    正则表达式使用的是贪婪匹配,也就是尽可能多的匹配尽量多的字符

    例题2. 请写出下面程序的结果:
    re.match(r'^(\d+?)(0)$', '102300').groups() 答:('102300', '')
    例题3:请写出匹配102300最后一个0的正则表达式?
    答:^(\d+?)0
    $

也就是说,对于 \d+ 这种贪婪匹配,加上 ? 就会变成非贪婪匹配(尽可能少匹配)