Python爬虫:Ptyhon中RE模块的使用

@高效码农  March 12, 2019

Ptyhon中RE模块的使用

1. 正则表达式

参考:廖雪峰的官方网站

2. Python Re模块

Python提供re模块,包含所有正则表达式的功能。由于Python的字符串本身也用转义,因此我们强烈建议使用Python的r前缀,就不用考虑转义的问题了

2.1   re.match(pattern, string[, flags])
如果字符串开头的零个或多个字符与正则表达式模式匹配,则返回相应的匹配对象。None如果字符串与模式不匹配则返回; 请注意,这与零长度匹配不同。

请注意,即使在多行模式下,re.match()也只会匹配字符串的开头而不是每行的开头。

# -*- coding: UTF-8 -*-
import re

# 将正则表达式编译成Pattern对象,注意hello前面的r的意思是“原生字符串”
pattern = re.compile(r'hello')

# 使用re.match匹配字符串,获得匹配结果,无法匹配返回None
result1 = re.match(pattern, 'hello!hello3')
result2 = re.match(pattern, 'helloo xugj!')
result3 = re.match(pattern, 'helo xugj!')
result4 = re.match(pattern, '888hello xugj!')

print(result1) # 返回的是:a Match object 

# 匹配result1
if result1:
    print(result1.group())
else:
    print(result1)
    print('1匹配失败')


# 匹配result2
if result2:
    print(result2.group())
else:
    print(result2)
    print('2匹配失败')


# 匹配result3
if result3:
    print(result3.group())
else:
    print(result3)
    print('3匹配失败')


# 匹配result4
if result4:
    print(result4.group())
else:
    print(result4)
    print('4匹配失败')

参考:Match API

2.2   re.search(pattern,string,flags = 0 )
扫描字符串,查找正则表达式模式产生匹配的第一个位置 ,并返回相应的match object.
如果字符串中没有位置与模式匹配则返回None;
# -*- coding:UTF-8 -*-

import re

pattern = re.compile(r'world')

resutl1 = re.search(pattern, 'hello wor1ld!')
resutl2 = re.search(pattern, 'hello world!')

if resutl1:
    print(resutl1.group())
else:
    print('匹配失败❎')


if resutl2:
    print('匹配成功✅:' + resutl2.group())
else:
    print('匹配失败❎')

运行结果:

匹配失败❎
匹配成功✅:world
2.3   re.split(pattern,string,maxsplit = 0,flags = 0)
按照能够匹配的子串将string分割后返回列表。maxsplit用于指定最大分割次数,不指定将全部分割。
import re

pattern = re.compile(r'\d+')

print(re.split(pattern, '这是1个测试split的demo'))

运行结果:

['这是', '个测试split的demo']
2.4   re.findall(pattern,string,flags = 0 )
以列表形式返回全部能匹配的子串。
import re

pattern1 = re.compile(r'\d+')
pattern2 = re.compile(r'[a-z]+')

print(re.findall(pattern1, '这是1个测试findall的123demo'))
print(re.findall(pattern2, '这是1个测试findall的123demo'))

运行结果:

['1', '123']
['findall', 'demo']
2.5    re.finditer(pattern, string[, flags])
返回一个顺序访问每一个匹配结果(Match对象)的迭代器。
import re

pattern = re.compile(r'[\d]+')
for p in re.finditer(pattern, '这是1个测试finditer的123demo'):
    print(p.group())

运行结果:

1
123
2.6     re.sub(pattern, repl, string[, count])
返回使用repl替换每一个匹配的字符串后的字符串
import re

pattern = re.compile(r'\d+')

print(re.sub(pattern, 'one', '这是101个测试sub函数的demo'))

运行结果:

这是one个测试sub函数的demo
2.7    re.subn(pattern, repl, string[, count])
返回 (sub(repl, string[, count]), 替换次数)。
import re

pattern = re.compile(r'\d+')

print(re.subn(pattern, 'one', '这是101个测试subn函数的demo23456'))

# 也可以通过pattern.subn() pattern.match()等调用
print(pattern.subn('two', '这是101个测试subn函数的demo23456'))

运行结果:

('这是one个测试subn函数的demoone', 2)
('这是two个测试subn函数的demotwo', 2)


评论已关闭