python模块 -- re正则表达式模块详解

re模块

1) regex = re.compile(pattern, flags=0)

  • 功能:产生正则表达式对象
  • 参数:
    • pattern 正则表达式
    • flags 功能标志位,扩展正则表达式的匹配
      • A==ASCII:            元字符只能匹配ascii码
      • I==IGNORECAE: 匹配忽略字母大小写
      • S==DOTALL :       使.可以匹配换行
      • M==MULTLINE :   使^$可以匹配每一行的开头结尾位置
      • X==VERBOSE :     为正则添加注释
  • 返回值:正则表达式对象
  • 用法: regex.findall(string, pos, endpos)

2)  regex.findall(string, pos, endpos)

  • 功能:根据正则表达式匹配目标字符串内容
  • 参数:string 目标字符串 pos 截取目标字符串的开始匹配位置 endpos 截取目标字符串的结束匹配位置
  • 返回值:匹配到的内容列表,如果正则表达式有子组则只能获取到子组对应的内容
>>> string="LiLei:1984,HanMeimei:1985"
>>> pattern=r"\w+:\d+"
>>> regex=re.compile(pattern)
>>> regex.findall(string)
['LiLei:1984', 'HanMeimei:1985']
>>>

3) re.findall(pattern, string, flags=0)

  • 功能:根据正则表达式匹配目标字符串内容
  • 参数:pattern 正则表达式 string 目标字符串 flags 功能标志位,扩展正则表达式的匹配
  • 返回值:匹配到的内容列表,如果正则表达式有子组则只能获取到子组对应的内容
>>> string="LiLei:1984,HanMeimei:1985"
>>> pattern=r"\w+:\d+"
>>> lst=re.findall(pattern,string)
>>> print(lst)
['LiLei:1984', 'HanMeimei:1985']

4)re.split(pattern, string, flags=0)

  • 功能:使用正则表达式匹配内容,切割目标字符串
  • 参数:pattern 正则表达式 string 目标字符串 flags 功能标志位,扩展正则表达式的匹配
  • 返回值:切割后的内容列表
>>> string="hello world,everyone!"
>>> re.split(r"[ ,!]",string)        # 根据正则表达式中指定的符号进行字符串分割
['hello', 'world', 'everyone', '']
>>>

5) re.sub(pattern, replace, string, max, flags = 0)

  • 功能:使用一个字符串替换正则表达式匹配到的内容
  • 参数:pattern 正则表达式 replace 替换的字符串 string 目标字符串 max 最多替换几处,默认替换全部
  • flags 功能标志位,扩展正则表达式的匹配
  • 返回值:替换后的字符串
>>> string="LiLei:1984,HanMeimei:1985"
>>> s=re.sub(r":",'-',string)
>>> print(s)
LiLei-1984,HanMeimei-1985

6) re.finditer(pattern, string, flags = 0)

  • 功能:根据正则表达式匹配目标字符串内容
  • 参数:pattern 正则表达式 string 目标字符串 flags 功能标志位,扩展正则表达式的匹配
  • 返回值:匹配结果的迭代器
>>> string='abc 123 a456 789b 666'
>>> iter=re.finditer(r"\b\d+\b",string)
>>> for ma in iter:
...     print(ma.group())
...
123
666
>>>

7) re.fullmatch(pattern, string, flags=0)

  • 功能:完全匹配某个目标字符串
  • 参数: pattern 正则表达式 string 目标字符串
  • 返回值:匹配内容match对象

8) re.match(pattern, string, flags=0)

  • 功能:匹配某个目标字符串开始位置
  • 参数:pattern正则表达式  string 目标字符串
  • 返回值:匹配内容的match对象
>>> string="Hello World 123!"
>>> ma=re.match(r"\w+",string)
>>> if ma:
...     print(ma.group())
...
Hello
>>> ma=re.match(r"\d+",string)
>>> if ma:
...     print(ma.group())
...
>>>

9)re.search(pattern, string, flags=0)

  • 功能:匹配目标字符串中第一个符合内容
  • 参数:pattern 正则表达式 string目标字符串
  • 返回值:匹配内容的match对象
>>> string="Hello World 123!"
>>> ma=re.search(r"\w+",string)
>>> if ma:
...     print(ma.group())
...
Hello
>>> ma=re.search(r"\d+", string)
>>> if ma:
...     print(ma.group())
...
123
>>>

match对象的属性方法

1) 属性变量

  1. pos:匹配的目标字符串开始位置
  2. endpos:匹配的目标字符串结束位置
  3. re:正则表达式
  4. string:目标字符串
  5. lastgroup:最后一组的名称
  6. lastindex:最后一组的序号

2) 属性方法

  1. span():获取匹配内容的起止位置。
  2. start():获取匹配内容起始位置。
  3. end():获取匹配内容的结束位置。
  4. groupdict():获取捕获组字段,组名为键,匹配的内容为值
  5. groups():字符对应内容元组
  6. group(n=0):获取match对象匹配的内容  参数:默认为0表示获取整个match对象的内容。如果是序列号或者是组名,表示获取对应自组内容。
>>> string="Name:HanMeimei"
>>> ret=re.search(r"(\w+):(?P<name>\w+)",string)
>>> ret
<_sre.SRE_Match object; span=(0, 14), match='Name:HanMeimei'>
>>> ret.pos
0
>>> ret.endpos
14
>>> ret.re
re.compile('(\\w+):(?P<name>\\w+)')
>>> ret.string
'Name:HanMeimei'
>>> ret.lastgroup
'name'
>>> ret.lastindex
2
>>> ret.span()
(0, 14)
>>> ret.start()
0
>>> ret.end()
14
>>> ret.groupdict()
{'name': 'HanMeimei'}
>>> ret.groups()
('Name', 'HanMeimei')
>>> ret.group()
'Name:HanMeimei'
>>> ret.group(1)
'Name'
>>> ret.group(2)
'HanMeimei'
>>>

元字符

1)普通字符

  • 匹配规则:每个普通字符匹配其对应的字符。
  • 用法:re.findall(正则表达式,被匹配的表达式)
  • >>> import re
    >>> re.findall('ab','abcdefgabcdefg')
    ['ab', 'ab']
    >>>

2) 或关系:

  1. 元字符:|
  2. 匹配规则:匹配|两侧任意的正则表达式
  3. >>> string="www.baidu.com/www.xrd.cn"
    >>> re.findall("com|cn",string)
    ['com', 'cn']
    >>>

3)匹配单个字符

  • 元字符:.
  • 匹配规则:匹配除换行符外的任意字符
>>> string="dig dug duck dag"
>>> re.findall("d.g",string)
['dig', 'dug', 'dag']
>>>

4) 匹配字符集

  • 元字符集:[字符集]
  • 匹配规则:匹配字符集中的任意一个字符
  • 表达式:[0-9] [a-z] [A-Z]匹配[]中的任意一个字符
>>> string="dig dug duck dag"
>>> re.findall("d[aci]g",string)
['dig', 'dag']
>>>

5)匹配字符集反集

  • 元字符:[^字符集]
  • 匹配规则:匹配除了字符集以外的任意一个字符
>>> string="dig dug duck dag"
>>> re.findall("d[^ai]g",string)
['dug']
>>>

匹配字符串开始位置

  • 元字符:^
  • 匹配规则:匹配目标字符串的开始位置
>>> string="hello world!"   # 字符串以h开头
>>> re.findall("^.",string)
['h']
>>>

匹配字符串结尾

  • 元字符:$
  • 匹配规则:匹配目标字符串的结束位置
>>> string="hello world!"   # 以!结尾的字符串
>>> re.findall(".$",string)
['!']
>>>

匹配字符重复

  • 元字符:*
  • 匹配规则:匹配前面的字符出现0次或多次
>>> string="ab aob aoob aooob axb"
>>> re.findall("ao*b",string)
['ab', 'aob', 'aoob', 'aooob']
>>>

  • 元字符:+
  • 匹配规则:匹配前面的字符出现1次或多次
>>> string="ab aob aoob aooob axb"
>>> re.findall("ao+b",string)
['aob', 'aoob', 'aooob']
>>>

  • 元字符:?
  • 匹配规则:匹配前面的字符出现0次或1次
>>> string="ab aob aoob aooob axb"
>>> re.findall("ao?b",string)
['ab', 'aob']
>>>

  • 元字符:{n}
  • 匹配规则:匹配前面的字符出现n次
>>> string="ab aob aoob aooob axb"
>>> re.findall("ao{2}b",string)
['aoob']

  • 元字符:{m,n}
  • 匹配规则:匹配前面的字符出现m到n次
>>> string="ab aob aoob aooob aoooob aooooob"
>>> re.findall("ao{2,4}b",string)
['aoob', 'aooob', 'aoooob']

匹配任意(非)数字字符

  • 元字符:\d \D
  • 匹配规则:\d匹配任意数字字符 \D匹配任意非数字字符
>>> string="123%c45x+z"
>>> re.findall("\d{2,3}",string)  # 匹配两位或三位的数字字符串
['123', '45']
>>> re.findall("\D{2,3}",string)  # 匹配两位或三位非数字组成的字符串
['%c', 'x+z']
>>>

匹配任意(非)普通字符

  • 元字符:\w \W
  • 匹配规则:\w 匹配普通字符,\W匹配普通字符
  • 说明:普通字符指数字、字母和下划线
>>> string="http port = 80"
>>> re.findall("\w+",string)   # 匹配普通字符
['http', 'port', '80']
>>> re.findall("\W+",string)   # 匹配非普通字符
[' ', ' = ']

匹配任意(非)空字符

  • 元字符:\s \S
  • 匹配规则:\s匹配空字符 \S匹配非空字符
  • 说明:空字符指空格 \r \n \t \v \f字符
>>> string="hello          world"
>>> re.findall('\s+',string)
['          ']
>>> re.findall('\S+',string)
['hello', 'world']
>>>

匹配开头结束位置

  • 元字符:\A \Z
  • 匹配规则:\A表示开头位置 \Z匹配结束位置
>>> string = "abc xyz 123"
>>> re.findall('\A.',string)  # 匹配字符串开头第一个字符
['a']
>>> re.findall('.\Z',string)  # 匹配字符串末尾最后一个字符
['3']
>>>

匹配(非)字符单词的边界位置

  • 元字符:\b \B
  • 匹配规则:\b表示单词边界 \B表示非单词边界
  • 说明:单词边界指数字字母(汉字)下划线与其它字符的交界位置。
>>> string="There are two dogs123 456!"
>>> re.findall(r"\b\w+\b",string)
['There', 'are', 'two', 'dogs123', '456']
>>> re.findall(r"\B\d+\b",string)
['123', '56']
>>>

贪婪模式和非贪婪模式

  • 贪婪模式:默认情况下,匹配重复的元字符总是尽可能多的向后匹配内容。
  • 非贪婪模式:让匹配重复的元字符尽可能少的向后匹配内容
  • 贪婪模式转为非贪婪模式:在匹配重复元字符后加'?'号即可

捕获组:

  • 格式:?P<name>pattern
  • name:指定搜索正则表达式的名称
  • pattern:正则表达式字符串
>>> string='abc123xyz456'
>>> re.search(r"(?P<digital>\d+)",string).group('digital')
'123'
>>>

练习:

1、匹配一个邮箱

>>> string="abc123@163.com Xyz456@sina.cn 12edf@gv.org abc#163.com 123@xxx"
>>> re.findall(r'[\w\d]+@[\w\d]+\.[\w\d]+',string)
['abc123@163.com', 'Xyz456@sina.cn', '12edf@gv.org']

2、匹配一个数值,正数、负数、整数、小数、分数、百分数

>>> string="12 ab 34.12 1/2 xy12 12ab 50.0% -10"
>>> re.findall(r'-?\d+[\./]?\d+%?',string)
['12', '34.12', '1/2', '12', '12', '50.0%', '-10']
>>>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值