创建正则表达式

匹配(大写表示去反)

  • \d可以匹配一个数字,
  • \w可以匹配一个字母或数字
  • \s可以匹配一个空白
  • .可以匹配任意字符


长度

    • 任意长度
    • 大于一个
  • ?表示0个或1个字符
  • 用{n}表示n个字符,用{n,m}表示n-m个字符

开头结尾

  • ^表示行的开头,^\d表示必须以数字开头。
  • $表示行的结束,\d$表示必须以数字结束

方括号 []

  • [0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线;
  • [0-9a-zA-Z\_]+可以匹配至少由一个数字、字母或者下划线组成的字符串,比如'a100','0_Z','Py3000'等等;
  • [a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量;
  • [a-zA-Z\_][0-9a-zA-Z\_]{0, 19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。

圆括号 ()组

  • (…) 匹配括号内的任何正则表达式,并指示组的开始和结束; 在匹配完成后可以检索组的内容,并且可以在后面的字符串中使用\number特殊序列进行匹配,之后有详细描述。 要匹配’(‘或’)’,请使用 \( 或 \) ,或将它们放在字符类中: [(],[]] 。 举个例子我有个字符串 ‘asdfa020-12345678bsaefga’ 可以看到我们的电话号码被一群字母围住了,怎么把电话号码拿出来,顺便把区号和真正的号码都分开呢? 可以用这样的规则(\d{4})-(\d)* 这样符合结果字符串就是 ‘020-12345678’ 但是,返回的结果对象并不仅仅是一个字符串,他还有.group,其中 group(1) = ‘020’ group(2)=’12345678’
  • \number 匹配相同编号的组的内容。
  • (?P…)
  • (?aiLmsux)

A|B可以匹配A或B

? 可以表示非贪婪匹配

  1. re.match(r'^(\d+?)(0*)$', '102300').groups()


re 模块

使用 re 模块 import re
由于反斜杠在 Python 中也有用处,而在正则中表示转义;所以一般使用 ‘s’ + 正则;这样就可以使用单引号了;
例 **s = r'ABC\-001**

正则表达式对象

我们写好一条规则,如r’.ello’,目前在python里面只是一个字符串,我们要让这个规则字符串变成正则表达式,需要将这个字符串编译一下,成为表达式对象,这个对象又称pattern,即样式。
re.compile(pattern, flags=0)
示例

  1. # regex = r'你的规则'
  2. pattern = re.compile(regex) #这里 regex只是规则字符串,pattern才是正则表达式对象
  3. result = pattern.match(string)
  4. # 等价于
  5. result = re.match(regex, string)

方法

  • pattern.search(string[, pos[, endpos]]) :
    • 扫描字符串查找第一个能匹配上pattern的部分,并返回相应的匹配对象。 如果字符串中没有位置与模式匹配,则返回None;
    • 可选的第二个参数pos在搜索要开始的字符串中给出一个索引,它默认为0,
    • 可选参数endpos表示搜索字符串的截止位置,也就是说,你想避开字符串结尾的部分。
  • Pattern.match(string[, pos[, endpos]])
    • 如果字符串开头的零个或多个字符与此正则表达式匹配,则返回相应的匹配对象。 如果字符串与模式不匹配,则返回None;
    • 这个函数和search差不多,但是,规定一定要从起始位置就得匹配上,否则就不算匹配成功。
    • 如果正则表达式中定义了组,就可以在Match对象上用group()方法提取出子串来。注意到group(0)永远是原始字符串,group(1)、group(2)……表示第1、2、……个子串。
  • pattern.fullmatch(string[, pos[, endpos]])
    • 如果整个字符串匹配此正则表达式,则返回相应的匹配对象。 如果字符串与模式不匹配,则返回None; 请注意,这与零长度匹配不同
  • pattern.split(string, maxsplit=0)

    • 这个函数根据表达式规则分拆字符串,返回一个list
    • 如果在表达式中使用捕获括号,则表达式中所有组的文本也会作为结果列表的一部分返回
    • 如果maxsplit不为零,则最多发生maxsplit分割,并且字符串的其余部分作为列表的最后一个元素返回。

      1. >>> pattern = re.compile(r'\W+')
      2. >>> pattern.split( 'Words,words,words.')
      3. ['Words', 'words', 'words', '']
      4. >>> pattern = re.compile(r'(\W+)')
      5. >>> pattern.split( 'Words, words, words.')
      6. ['Words', ', ', 'words', ', ', 'words', '.', '']
    • 如果分隔符中有捕获组,并且它在字符串的起始处匹配,则结果将以空字符串开头。 字符串的结尾也是一样

      1. >>> pattern = re.compile(r'(\W+)')
      2. >>> pattern.split( '...words, words...')
      3. ['', '...', 'words', ', ', 'words', '...', '']
  • pattern.finditer(string[, pos[, endpos]])

    • 返回一个迭代器,产生字符串中RE模式的所有非重叠匹配的匹配对象。
  • pattern.sub(repl, string, count=0)

    • python自带replace函数的加强版。
    • 先通过正则表达式规则找到string中符合规则的部分,然后替换成repl;如果未找到能匹配规则的部分,则字符串将保持不变。
    • repl可以是一个字符串或一个函数; 如果它是一个字符串,则处理其中的任何反斜杠转义。

      1. >>> pattern = re.compile(r'\d*(\d)')
      2. >>> pattern.sub(r'\1','12abc34de56fg89') # 这里的r'\1'对应的就是上面 r'\d*(\d)'中的(\d)
      3. '2abc4de6fg9'
    • 如果repl是一个函数,它会实现更加复杂的替换,比如我们需要把分割字母的数字翻倍。也就是,我们我们每个匹配到的数字,我们都要通过函数处理一下,以返回值作为repl 例如

      1. >>> def func(n):
      2. ... return str(int(n.group())*2)
      3. ...
      4. >>> pattern = re.compile(r'\d+')
      5. >>> pattern = re.sub(func,'12abc34de56fg89')
      6. '24abc68de112fg178'
  • pattern.subn(repl, string, count=0)

执行与sub()相同的操作,但返回一个元组

属性

  • pattern.flags
    • 正则表达式匹配标志。在re.compile()函数中设定,
    • 值 :
      • re.A 仅ASCII匹配而不是完全Unicode匹配
      • re.I 不区分大小写
      • 其他 。。。(百度)
  • pattern.groups
    • 查看模式中的捕获组数量。也就是你在规则中使用捕获括号的数量;比如 p = re.compile(r’hello(\d)’) 那么这时 p.groups 就是 1
  • pattern.groupindex
    • 如果你在规则设定的时候使用了(?P),那么这个变量可以返回该特殊符号使用的情况。 将(?P)定义的任何符号组名称映射到组编号的字典。 如果模式中没有使用符号组,则字典为空。
  • pattern.pattern
    • 模式对象编译的模式字符串。就是那个写下的规则。