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 = '''
  
  • 2002的第一场雪
  • 我在佛前苦苦求了几千年
  • 无敌是多么寂寞
  • 沧海一声笑
  • 光辉岁月
  • 童年
  • ''' regex_4='(.*?)' 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
    

    你可能感兴趣的:(正则表达式,Python,爬虫)