实现正则切割的函数是re.split,它的参数是:

  1. re.split(pattern, string, maxsplit=0, flags=0)

这个函数相对前面的函数多了maxsplit,表示最大切割次数。 该函数最常见的应用场景就是字段分割。 例如,我们需要切割出下面这个字符串的每个连续的字符串(含有不确定数量的空格和tab):

  1. s="FRN2004001 100 VCP772Z 417 BX 417 BX
  2. 181128307 CN10 1220 2000 5,004 EA 2020.03.30
  3. 45408263 L12 L12"

可以使用正则进行切割:

  1. fields = re.split("\s+", s)
  2. print(fields)

结果:

  1. ['FRN2004001', '100', 'VCP772Z', '417', 'BX', '417', 'BX', '181128307',
  2. 'CN10', '1220', '2000', '5,004', 'EA', '2020.03.30', '45408263', 'L12',
  3. 'L12']

如果我们希望最后两个L12不被切割,可以设置maxsplit:

  1. print(re.split("\s+", s, maxsplit=15))

结果:

  1. ['FRN2004001', '100', 'VCP772Z', '417', 'BX', '417', 'BX', '181128307',
  2. 'CN10', '1220', '2000', '5,004', 'EA', '2020.03.30', '45408263', 'L12\tL12']

这样最后一个空白字符\t就没有被切割。 当然对于这个例子,直接使用字符串自带的切割就可以实现,不传参数模式就是用连续的空白字符切 割:

  1. s.split()

  1. s.split(maxsplit=15)

结果与上面一致。 下面举一个必须用正则切割才能解决的问题:
环视切割,有一个字符串:

  1. s = "北京西北京站北京北北京南站北京东"

我们需要取出其中所有的北京xx,即北京西、北京站、北京北、北京南站 和 北京东。 使用正则切割会非常简单:

  1. s = "北京西北京站北京北北京南站北京东"
  2. re.split("(?<!^)(?=北京)", s)

结果:

  1. ['北京西', '北京站', '北京北', '北京南站', '北京东']

在前面的正则匹配规则表中的非捕获组与环视已经说明: (?=…) 肯定环视,表示右边是指定内容的位置

(?<!^) 表示切割位置的左边不能是行的开头, (?=北京) 表示切割位置的右边必须是北京

compile编译正则表达式

re.compile() 返回 re.Pattern正则表达式编译对象(跟java语言的Pattern类原理一样)。 语法格式为:

  1. re.compile(pattern, flags)

前面的每个正则方法:re.fullmatch、re.findall、re.sub、re.split等方法,执行过程中都会先编译正则 表达式(开启DEBUG模式可以看到解析树),如果有些正则表达式会反复被使用,重复的编译会造成 较大的资源浪费。于是我们可以通过re.compile方法提前将正则表达式编译好,以后反复使用不会重复 编译。
编译一个正则测试一下:

  1. pattern = re.compile('(\d+)')
  2. print(pattern, type(pattern))

结果:

  1. re.compile('(\\d+)') <class 're.Pattern'>

可以看到:

  1. print([m for m in dir(pattern) if not m.startswith("__")])
  1. ['findall', 'finditer', 'flags', 'fullmatch', 'groupindex', 'groups',
  2. 'match', 'pattern', 'scanner', 'search', 'split', 'sub', 'subn']

具备上述所有方法。
来源于python官方文档:https://docs.python.org/zh-cn/3.7/library/re.html