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) 属性变量
- pos:匹配的目标字符串开始位置
- endpos:匹配的目标字符串结束位置
- re:正则表达式
- string:目标字符串
- lastgroup:最后一组的名称
- lastindex:最后一组的序号
2) 属性方法
- span():获取匹配内容的起止位置。
- start():获取匹配内容起始位置。
- end():获取匹配内容的结束位置。
- groupdict():获取捕获组字段,组名为键,匹配的内容为值
- groups():字符对应内容元组
- 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) 或关系:
- 元字符:|
- 匹配规则:匹配|两侧任意的正则表达式
-
>>> 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']
>>>