Python——re模块

re模块

1. 匹配常用方法

(1) findall

  返回值:列表:列表中是所有匹配到的项

import re
ret = re.findall('a','eva egon yuan')       #['a', 'a']
print(ret)
ret = re.findall('[a-z]+','eva egon yuan')      #['eva', 'egon', 'yuan']
print(ret)
View Code

(2) search

  ret = search('\d(\w)+','bdsjdbc14564fvfv')

  ret = search('\d(?P<name>\w)+','bdsjdbc14564fvfv')   #给分组命名为name

  找整个字符串,遇到匹配上的就返回,遇不到就返回None

  如果有返回值,ret.group()就可以取到值

  取分组中的内容:ret.group(1)  #按照组的顺序(从第一个开始)

          ret.group('name')  #按照组的名字

import re

ret = re.search('a','eva egon yuan')
print(ret)  #<_sre.SRE_Match object; span=(2, 3), match='a'>
print(ret.group())  #a
View Code

 

import re

# 报错:如果没有找到结果,那么返回None,调用group会报错
# ret = re.search('m','eva egon yuan')
# print(ret)  #None
# print(ret.group())  #AttributeError: 'NoneType' object has no attribute 'group'

# 使用下面方法不报错
# (1) 找到结果
ret = re.search('a','eva egon yuan')
if ret:
    print(ret.group())  #a
#  (2) 没有找到结果
ret = re.search('m','eva egon yuan')
if ret:
    print(ret.group())  #无任何结果,也不报错
View Code

(3) match

   从头开始匹配,匹配上就返回,匹配不上就返回None

  匹配上:ret.group()取值

import re

# 如果正则规则从头开始可以匹配上,则返回一个变量,调用group显示
# 如果没匹配上,就返回None,调用group会报错
ret = re.match('[a-z]+','eva egon yuan')
if ret:
    print(ret.group())  #eva
View Code

2. 其他常用方法

(1) 分割 split

import re

# 先按照'a'分割得到''和'bcd',再对''和'bcd'分别按照'b'分割
ret = re.split('[ab]','abcd')
print(ret)  #['', '', 'cd']
View Code

(2) 替换 sub  subn

import re

# 将数字替换成'H',参数1表示替换一次
ret = re.sub('\d','H','eva3egon4yuan4',1)
print(ret)  #evaHegon4yuan4
View Code

 

import re

# subn
# 将数字替换成'H',返回替换结果和替换次数
ret = re.subn('\d','H','eva3egon4yuan4')
print(ret)  #('evaHegonHyuanH', 3)
View Code

(3) 返回迭代器 finditer

  返回很多值,不想让它们一次性全部出现在内存里

import re

# 返回一个存放匹配结果的迭代器
ret = re.finditer('\d','ds3sy4764384a')
print(ret)  #<callable_iterator object at 0x0000013D05E83198>
# 查看第一个结果
print(next(ret).group())    #3
# 查看第二个结果
print(next(ret).group())    #4
# 查看剩余的所有结果
print([i.group() for i in ret]) #['7', '6', '4', '3', '8', '4']

# 查看所有匹配结果:循环打印其中的数字
ret = re.finditer('\d','ds3sy4764384a')
for i in ret:
    print(i.group())    # 3     4       6       7       3       8       4
View Code

(4) 编译 compile

  正则表达式很长且要多次使用

import re

# 将正则表达式编译成一个正则表达式对象
obj = re.compile('\d{3}')   #此规则要匹配3个数字
ret = obj.search('abc123eeee')
print(ret.group())  #123
ret = obj.search('412e')
print(ret.group())  #412
ret = obj.search('abgfnjgn78967ee')
print(ret.group())  #789
View Code

3. 分组优先

(1)findall的优先级查询——?:

import re

ret = re.findall('www.(baidu|oldboy).com','www.oldboy.com')
print(ret)  #['oldboy']
# ?:——取消分组优先
ret = re.findall('www.(?:baidu|oldboy).com','www.oldboy.com')
print(ret)  #['www.oldboy.com']
View Code

(2)split的优先级查询——()

import re

ret = re.split("\d+","eva3egon4yuan")
print(ret)  #['eva', 'egon', 'yuan']
# 加()——取消分组优先
ret = re.split("(\d+)","eva3egon4yuan")
print(ret)  #['eva', '3', 'egon', '4', 'yuan']
View Code

 

 

posted @ 2018-10-08 21:16  xc_718  阅读(144)  评论(0编辑  收藏  举报