侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 748 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

Python基础(17)之re模块

zze
zze
2019-04-29 / 0 评论 / 0 点赞 / 608 阅读 / 3204 字

常用方法

findall()

以列表返回所有满足条件的结果。

import  re
print(re.findall('\d','a1b2c2abc123'))#['1', '2', '2', '1', '2', '3']

查找到第一个匹配信息就返回一个包含匹配信息的对象(未找到时返回 None),该对象通过 group() 函数查看结果。

import re
str = 'a1b2c2abc123'
print(re.search('\d', str).group())  # 1

match()

从字符串开始位置匹配,其它同 search()

import re
str = 'a1b2c2abc123'
print(re.match('\d', str).group() if re.match('\d', str) else '未找到')  # 未找到
print(re.match('a.+', str).group() if re.match('a', str) else '未找到')  # a1b2c2abc123

split()

以正则匹配到的字符切割字符串,返回切割后的字符串列表。

import re
str = 'a1b2c2abc123'
print(re.split('[123]', str))  # ['a', 'b', 'c', 'abc', '', '', '']

sub()

将匹配到的内容替换为指定内容,返回替换后的字符串。

import re
str = 'a1b2c2abc123'
print(re.sub('[123]', 'A', str))  # aAbAcAabcAAA

subn()

将匹配到的内容替换为指定内容,返回元组。第一个值是替换后的字符串,第二个值是替换的次数。

import re
str = 'a1b2c2abc123'
print(re.subn('[123]', 'A', str))  # ('aAbAcAabcAAA', 6)

compile()

将正则表达式编译为字节码对象,可多次调用。

import re
str = 'a1b2c2abc123'
re_obj = re.compile('[123]')
print(re_obj.sub('A', str))  # aAbAcAabcAAA
print(re_obj.subn('A', str))  # ('aAbAcAabcAAA', 6)
print(re_obj.findall(str))  # ['1', '2', '2', '1', '2', '3']
print(re_obj.split(str))  # ['a', 'b', 'c', 'abc', '', '', '']
print(re_obj.match(str))  # None
print(re_obj.search(str).group())  # 1

finditer()

返回一个存放匹配结果的迭代器。

import re
str = 'a1b2c2abc123'
result = re.finditer('\d', str)
print(result)  # <callable_iterator object at 0x00000000026F80F0>
print(next(result).group())  # 1
print(next(result).group())  # 2
print([g.group() for g in result])  # ['2', '1', '2', '3']

补充

优先级问题

findall()

findall 会优先把组匹配结果内容返回,?: 可取消优先返回组匹配结果。

import re
print(re.findall('zz([a-y])', 'zze'))  # ['e']
print(re.findall('zz(?:[a-y])', 'zze'))  # ['zze']

split()

当正则包含组时,切割结果会保留分割内容。

import re
str = 'a1b2c2abc123'
print(re.split('\d', str))  # ['a', 'b', 'c', 'abc', '', '', '']
print(re.split('(\d)', str))  # ['a', '1', 'b', '2', 'c', '2', 'abc', '1', '', '2', '', '3', '']

组命名

可通过 ?P<name> 给组命名。

import re
str = '<title>python learning</title>'
result = re.search('<(?P<tag_name>[a-z]+)>(?P<title>.+)</([a-z]+)>', str)
print(result.group('title'))  # python learning
print(result.group('tag_name'))  # title
print(result.group())  # <title>python learning</title>
0

评论区