Python 内置模块之 re 正则表达式

时间:2022-01-13 03:44:36

>>> import re

正则表达式的构成

  • 普通字符:数字、字母
  • 转义字符:\
    • \s 匹配任何空白字符  
    • \S  匹配任何非空白字符
    • \d  匹配数字
    • \D  匹配任何非数字字符
    • \w  匹配字母或数字或下划线或汉字
    • \W  匹配任何非字母数字字符
  • 通配符
    • . : 表示除换行符以外的任意字符。
    • [ ] : 表示一个字符域。 [0-9][a-zA-Z]
  • 修饰符 (对前面的字符进行修饰)
    • ?:表示0个或1个前面的字符
    • *: 表示0个或多个前面的字符。.* 表示任意字符
    • +: 表示1个或多个前面的字符
    • {n}:表示n个前面的字符。
    • {n,}: 表示n或大于n个前面的字符。
    • {n, m}:表示n个到m个前面的字符。
  • 其他
    • ^  表示以什么开头行
    • $  表示以什么结尾的行
    • |  表示“或” 。  如 'f(oo|ee)l' 匹配 fool 或 feel
    • () 表示一个字符集。? * + 等默认只能修饰前面一个字符,利用()可以实现多个字符分组
    • (?P<name>...)  为分组定义key

正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。可以使用Python的r前缀,匹配文本中的字符"\",而不用'\\'表示反斜杠

如 r'\d' 就表示'\d' 而不是数字,这样写出来的表达式更直观。

 

操作方法

  • re.match(pattern, string, flags=0)  从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None
  • re.search(pattern, string, flags=0)  浏览整个字符串去匹配第一个,未匹配成功返回None
  • re.findall(pattern, string, flags=0)   把所有匹配到的字符放到以列表中的元素返回
  • re.sub(pattern, repl, string, count=0, flags=0) 替换匹配成功的指定位置字符串
  • re.split(pattern, string, maxsplit=0, flags=0)  根据正则匹配分割字符串

flags 常用匹配模式

  • flags=re.I (re.IGNORECASE): 忽略大小写
  • flags=re.M (re.MULTILINE): 多行模式,改变'^''$'的行为,默认'^''$'是以单行模式匹配
  • flags=re.S (re.DOTALL): 改变'.'的行为,定义该模式后'.'表示包括换行符的任意字符

匹配返回的对象操作

  • r.group()  # 获取匹配到的所有结果
  • r.groups()  # 获取模型中匹配到的分组结果
  • r.groupdict()  # 获取模型中匹配到的分组中所有执行了key的组 
>>> re.match('h\w+','hello world!')
<_sre.SRE_Match object; span=(0, 5), match='hello'>

>>> re.match('hello','Hello world',flags=re.IGNORECASE)
<_sre.SRE_Match object; span=(0, 5), match='Hello'>
>>> re.search('o$','\nhello\nworld',flags=re.MULTILINE)
<_sre.SRE_Match object; span=(5, 6), match='o'>
>>> re.search('^w.*','\nhello\nworld',flags=re.MULTILINE)
<_sre.SRE_Match object; span=(7, 12), match='world'>
>>> re.search('.*','hello\nworld')
<_sre.SRE_Match object; span=(0, 5), match='hello'>
>>> re.search('.*','hello\nworld',flags=re.DOTALL)
<_sre.SRE_Match object; span=(0, 11), match='hello\nworld'>

>>> re.findall('\W','test@163.com')
['@', '.']
>>> re.findall('(\w+).(\w+).(\w+)','test@163.com')
[('test', '163', 'com')] # 注意返回的列表里是元组

>>> re.sub('^\w{4}','boy','girlfriend')
'boyfriend'

>>>re.split('\W','test@163.com')
['test', '163', 'com']

>>> r=re.search('(\w+)-(\w+)','linux-Python3')
>>> r.group()
'linux-Python3'
>>> r.groups()
('linux', 'Python3')
>>> r.group(1)
'linux'
>>> r.group(2)
'Python3'
>>> r=re.search('(?P<platform>\w+)-(?P<version>\w+\d)','linux-Python3')
>>> r.groupdict()
{'platform': 'linux', 'version': 'Python3'}