python3网络爬虫开发实战学习笔记(一)--------python正则表达式re模块

这篇文章主要是讲 re模块的四个常见方法

re.match()
re.search()
re.findall()
re.sub()
的作用,参数,返回值类型,示例代码

如果对python正则表达式匹配规则不太熟悉的同学,可以先看看我下面这篇博客
常用的正则表达式规则 https://blog.csdn.net/weiyang_tang/article/details/82807656

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

作用:

re.match 尝试从字符串的起始位置匹配一个模式(pattern),如果不是起始位置匹配成功的话,match()就返回None

参数:

pattern:正则表达式(或者正则表达式对象)
string:要匹配的字符串
flags:修饰符,见下表

返回值的类型

匹配成功re.match方法返回一个匹配的对象,否则返回None

函数

group()匹配成功,返回匹配的字符串,否则抛出异常

group(i)匹配成功,则返回第i个(正则表达式)里的字符串,否则抛出异常

span()匹配成功,则返回匹配成功的位置,否则抛出异常

修饰符

修饰符 描述
re.I 使匹配对大小不敏感
re.M 多行匹配,影响^和$
re.S 使.匹配包括换行符在内的所有字符

未全部列出,常用的就是re.I和re.S

import re

content='Hello 2018,I am happy'
regex='\w+.*?\d{4}.*?\w'
result=re.match(regex,content)
if result!=None:
    print(result.group())
else:
    print('None')
print()
regex_2='\d{4}.*?\w'
result=re.match(regex_2,content)
if result!=None:
    print(result.group())
else:
    print('None')
#(.*?)表示尽可能少的匹配字符

结果:

Hello 2018,I

None

小插曲

Python报错
AttributeError: 'NoneType' object has no attribute 'group'

解决方法
AttributeError: ‘NoneType’ object has no attribute ‘group’
(https://blog.csdn.net/weiyang_tang/article/details/82806920)

match()匹配目标并获取

在正则表达式里,要获取的字符串用 ()表示

import re
content='Hello 1234567 world_this I love you'
regex='^Hello\s(\d+)\s(\w+)'
result=re.search(regex,content)
print(result)
print(result.group())
print(result.group(1)) #匹配的是括号里的(\d+)
print(result.group(2)) #匹配的是括号里的(\w+)

结果:

Hello 1234567 world_this
1234567
world_this
  1. search()
re.search(pattern, string, flags=0)

作用:

函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None

注意只返回第一个匹配成功的字符串
参数:

pattern:正则表达式(或者正则表达式对象)
string:要匹配的字符串
flags:修饰符,见下表

返回值的类型

匹配成功re.search方法返回一个匹配的对象,否则返回None

re.match()和re.search()用法类似

唯一的区别在于re.match()从字符串头开始匹配,若头匹配不成功,则返回None

  1. findall()
    用法同re.search()

不同的地方在于,返回的是一个列表,即返回所有匹配成功的字符串
举个例子:

import re

html = '''
  <div>
  <li><a href="" singer="刀郎">2002的第一场雪</a></li>
  <li><a href="1/mp3" singer="平安">我在佛前苦苦求了几千年</a></li>
  <li class="active"><a href="2/mp3" singer="无敌">无敌是多么寂寞</a></li>
  <li><a href="3/mp3" singer="任思齐">沧海一声笑</a></li>
  <li><a href="4/mp3" singer="麒麟">光辉岁月</a></li>
  <li><a href="5/mp3" singer="永琪">童年</a></li>
'''
regex_4='<a.*?>(.*?)</a>'
results=re.findall(regex_4,html,re.S)
print(results) # 把所有的歌名提取打印出来
for result in results:
    print(result)

结果:

['2002的第一场雪', '我在佛前苦苦求了几千年', '无敌是多么寂寞', '沧海一声笑', '光辉岁月', '童年']
2002的第一场雪
我在佛前苦苦求了几千年
无敌是多么寂寞
沧海一声笑
光辉岁月
童年
  1. sub()
    用法都是类似的,

区别:sub()用于替换

 sub(pattern, repl, string, count=0, flags=0):

参数:

pattern:正则表达式(或者正则表达式对象)
  repl:替换的字符串
string:要匹配的字符串
flags:修饰符,见下表

例子

# -*- coding: utf-8 -*-
# @Time    : 2018/9/21 8:55
# @Author  : Tangweeiyang
# @File    : regex_04_sub.py
import re

str='I12LO1%V258%E.,,,,L351N896'
regex_1='\d+|\W+'
result=re.sub(regex_1,'',str)
print(result,'\n')

str_2='I我LOVE爱刘LN***********妮*********'
regex_1='\d+|\W+'
#\d表示数字,+表示1个或者多个,\W(大写的W)表示非数字.字母.下划线的其他字符(比如标点符号,\t\n\f\r),a|b表示匹配a或者b
#我刚刚发现一个有趣的现象,\w是可以匹配汉字的
#\w匹配的是能组成单词的字符,在python3 中re默认支持的是unicode字符集,当然也支持汉字
result=re.sub(regex_1,'',str_2)
print(result,'\n')
#不匹配汉字[\u4e00-\u9fa5]
regex_2='[\u4e00-\u9fa5]'
result=re.sub(regex_1,'',str_2)
result=re.sub(regex_2,'',result)
print(result)
regex_3='[\d\W\u4e00-\u9fa5]'
result=re.sub(regex_3,'',str_2)
print(result)

#compile()函数的运用

pattern=re.compile(regex_3)
result=re.sub(pattern,'',str_2)
print(result)


结果:

ILOVELN 

I我LOVE爱刘LN妮 

ILOVELN
ILOVELN
ILOVELN

猜你喜欢

转载自blog.csdn.net/weiyang_tang/article/details/82810284