正则表达式

知识点

匹配单个字符

字符 功能
. 匹配任意一个字符,除了\n
[] 匹配括号中列举的字符,如:[abc]、[a-z]
\d 匹配数字0-9
\D 匹配非数字的部分
\s 匹配空白字符,即空格、tab
\S 匹配非空白字符
\w 匹配单词字符,即a-z、A-Z、0-9、中文字符
\W 匹配非单词字符

注意点:

点号(.)本身是不支持检测换行符的,但是可以通过追加re.S参数来实现支持匹配换行,如下:

1
2
3
import re

re.match(r'.+', "shuai\nqi\n", re.S)

匹配多个字符

字符 功能
* 匹配前一个字符0次或者无限次,即可有可无
+ 匹配前一个字符1次或者无限次,即至少有一次
? 匹配前一个字符0次或者1次,即要么有一次,要么0次
{m} 匹配前一个字符出现m次
{m,n} 匹配一个字符出现m到n次

匹配开头结尾

字符 功能
^ 匹配字符串开头
$ 匹配字符串结尾

匹配分组

字符 功能
| 匹配左右任意一个字符,可以用括号限定分隔号作用的范围,如:\d+@(126|163)\.com
(ab) 将括号中字符串作为一个分组,之后可以用group(num)将分组中匹配的字符串打印出来
\num 引用分组num匹配到的字符串
(?P<name>) 给分组起别名,便于正则表达式后面的调用,如:^http:(?P<p1>\w*)wow(?P=p1)$
(?P=name) 引用别名name分组匹配到的字符串

注意点:

  1. 一般情况下利用(ab)、\num方式就可以适用分组匹配的结果了,除非是超级长的正则表达式

  2. 便于理解,现下举例描述:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    import re

    str_list = ['shuai@126.com', 'test@163.com', '<h1>qwer</h1>']
    # match方法用于匹配索要所有的字符串中是否有符合正则规则的内容,有则返回字符串对象,没有则返回None
    # 利用括号限制分隔符的作用范围
    ret = re.match(r'([a-z]*)@(126|163)\.com', str_list[0])
    # 利用group可以打印出匹配的字符串
    print(ret.group())
    print(ret.group(1)) # 利用group(num)可以打印出指定括号中匹配的数据, 此处打印[a-z]*匹配的内容

    # 利用括号设置分组, 如下\1表示的是第一个括号中\w匹配的字符内容
    ret = re.match(r'^<(\w)>[a-z]+</\1>$', str_list[2])

    # 利用起别名的方式,同样可以实现分组
    ret = re.match(r'^<(?P<p1>\w)>[a-z]+</(?P=p1)>$', str_list[2])

    常见函数

    • 作用:

      可以在文章中搜索正则匹配的内容,一旦匹配,即返回第一次匹配的文字对象

    • 格式:

      re.search(正则表达式, 匹配字符串)

    • 示例:

      1
      2
      3
      4
      5
      import re

      string = '阅读数:999,转载数:888'
      ret = re.search(r'\d+', string) # 只会匹配999,不会匹配888
      print(ret.group()) # 无法适用group(num)返回对应的匹配值

    re.findall

    • 作用:

      匹配字符串中所有符合正则的内容,匹配则返回匹配内容的列表,无匹配则返回空列表

    • 格式:

      re.findall(正则表达式, 匹配字符串)

    • 示例:

      1
      2
      3
      4
      5
      import re

      string = '阅读数:999,转载数:888'
      ret = re.findall(r'\d+', string) # 不仅匹配999,还匹配888
      print(ret) # 返回值是一个列表

    re.sub

    • 作用:

      用指定文本替换正则表达式匹配的文本内容,替换成功后返回对应的字符串

    • 格式:

      re.sub(正则表达式, 替换文本/文本处理函数, 字符串内容)

    • 示例:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      import re

      def change_str(temp):
      strnum = temp.group()
      num = int(strnum) + 1
      return str(num)

      string = '阅读数:999,转载数:888'
      # 利用change_str函数将字符串中所有符合正则的内容进行了转换,并替换掉
      ret = re.sub(r'\d+', change_str, string)
      # 也可直接用字符串替换
      # ret = re.sub(r'\d+', "devin", string)
      print(ret) # 返回值是一个转换后的字符

    re.split()

    • 作用

      按照正则表达式将字符串进行切割,最后返回切割后的列表

    • 格式

      re.split(正则表达式, 字符串)

    • 示例

      1
      2
      3
      4
      5
      import re

      string = '阅读数:999,转载数:888'
      ret = re.split(r':| ', string)
      print(ret)

作业

  1. (问答)正则表达式中点号(.)本身是不支持检测换行符的,如何设置让其能够匹配换行符
  2. 现有字符串shuai@126.com,请利用match和group的方法提取出其中字符shuai
  3. (问答)在正则中可以用起别名的方式简化正则表达式中成对出现的字符,如何实现正则表达式的起别名
  4. 现有字符串shuai@126.com,请利用search匹配出其中字符126,并将信息打印出来
  5. 现有字符’阅读数:999,转载数:888’,请利用findall匹配出其中所有的字符串信息,并将其打印出来
  6. 现有字符’阅读数:999,转载数:888’,请利用sub方法,将其中所有的数字全部+1后,将修改后的字符串信息打印出出
  7. 现有字符‘shuai@126.com’,请利用正则将字符串按@和.进行分割成列表,然后将信息打印出来