Day 2【Datawhale】爬虫入门学习——正则表达式及re模块的运用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27283619/article/details/89072775

1 正则表达式的基础知识

正则表达式:自定义的规则,用来描述字符串的排列,也称为模式表达式
Python中常使用re模块实现Python的正则表达式的功能,正则表达式的书写需要知道原子、元字符、模式修正符、贪婪模式、懒惰模式等知识。

1.1 原子

原子是正则表达式中最基本的组成单位,每个正则表达式至少包含一个原子,常见为一下几类:

  • 普通字符作为原子;
  • 非打印字符作为原子;
  • 通用字符作为原子;
  • 原子表
# 1.原子——普通字符作为原子(数字、大小写字母,下划线等)

import re # 要使用Python中的正则表达式,就要导入re模块
pattern = "yue" # 普通字符作为原子,设置正则表达式,并将值赋给变量pattern
string = "http://yum.iqianyue.com" # 定义一串字符串
result1 = re.search(pattern,string) # 运用re模块中的search()函数进行匹配,并将结果返回给变量result1
print(result1) # 打印结果
# 2.原子——非打印字符作为原子(格式个控制符,如\n换行符,\t制表符)
import re # 要使用Python中的正则表达式,就要导入re模块
pattern = "\n" # 普通字符作为原子,设置正则表达式,并将值赋给变量pattern
string = '''http://yum.iqianyue.com
http://www.baidu.com''' # 定义一串字符串
result1 = re.search(pattern,string) # 运用re模块中的search()函数进行匹配,并将结果返回给变量result1
print(result1) # 打印结果
# 3.原子——通用字符作为原子(即一个原子可以匹配一类字符)
'''
\w——匹配任意一个字母、数字或下划线
\W——匹配除字母、数字和下划线以外的任意一个字符
\d——匹配任意一个十进制数
\D——匹配除十进制数以外的任意一个其他字符
\s——匹配任意一个空白字符
\S——匹配除空白字符以外的任意一个其他字符
'''
import re # 要使用Python中的正则表达式,就要导入re模块
pattern = "\w\dpython\w" # 普通字符作为原子,设置正则表达式,并将值赋给变量pattern
string = '''abcdfphp345pythony_py''' # 定义一串字符串
result1 = re.search(pattern,string) # 运用re模块中的search()函数进行匹配,并将结果返回给变量result1
print(result1) # 打印结果
# 4.原子——原子表(可以定义一组地位平等的原子,然后匹配的时候会取该原子表中任意的一个原子进行匹配,即多对一的匹配,[]表示
'''
[]——可以匹配[]中的任意一个字符
[^]——可以匹配除了中括号中的任意原子
'''
import re # 要使用Python中的正则表达式,就要导入re模块
pattern1 = "\w\dpython[xyz]\w" # 普通字符作为原子,设置正则表达式,并将值赋给变量pattern1
pattern2 = "\w\dpython[^xyz]\w"
pattern3 = "\w\dpython[xyz]\W"
string = '''abcdfphp345pythony_py''' # 定义一串字符串
result1 = re.search(pattern1,string) # 运用re模块中的search()函数进行匹配,并将结果返回给变量result1
result2 = re.search(pattern2,string)
result3 = re.search(pattern3,string)
print(result1) # 打印结果
print(result2)
print(result3)

1.2 元字符

元字符——在正则表达式中具有一些特殊含义的字符,可以分为任意匹配元字符(.)、边界限制元字符(^、$)、限定符( ? + {n} {n,} {n,m})、模式选择符|、模式单元()等*
.——匹配除换行符以外的任意字符
^——匹配字符串开始的位置
$——匹配字符串结束的位置
*——匹配0次、1次或多次前面的原子
?——匹配0次或1次前面的原子
+——匹配1次或多次前面的原子
{n}——前面的原子恰好出现n次
{n,}——前面的原子至少出现n次
{n,m}——前面的原子至少出现n次,至多出现m次
|——模式选择符,可以设置多个模式,匹配时可以从中选择任意一个模式匹配
()——模式单元符,可以使用()将一些原子组合成一个大原子使用,小括号括起来的部分会被当做一个整体去使用

# 1.元字符——任意匹配元字符(.)
import re
pattern = '.python...'
string = "abcdfphp345pythony_py"
result1 = re.search(pattern,string)
print(result1) # 打印结果
# 2.元字符——边界限定符(^ $)
import re
pattern1 = "^abd"#必须以'abd'开头
pattern2 = "^abc"#必须以'abc'开头
pattern3 = "py$"#必须以'py'结尾
pattern4 = "ay$"#必须以'ay'结尾
string = '''abcdfphp345pythony_py''' # 定义一串字符串
result1 = re.search(pattern1,string) # 运用re模块中的search()函数进行匹配,并将结果返回给变量result1
result2 = re.search(pattern2,string)
result3 = re.search(pattern3,string)
result4 = re.search(pattern4,string)
print(result1) # 打印结果
print(result2)
print(result3)
print(result4)
# 3. 元字符——限定符(* ? + {n} {n,} {n,m})
import re
pattern1 = 'py.*n' # 匹配'py'和'n'之间可以是除换行符外的任意字符,该任意字符可以出现0次、1次或多次
pattern2 = 'cd{2}' # 匹配'cd'字符串中的d恰好出现两次
pattern3 = 'cd{3}' # 匹配'cd'字符串中的d恰好出现3次
pattern4 = 'cd{2,}' # 匹配'cd'字符串中的d至少出现2次,此时只要满足格式,就会在源字符中尽可能多的匹配字符
string = '''abcdddfphp345pythony_py''' # 定义一串字符串
result1 = re.search(pattern1,string) # 运用re模块中的search()函数进行匹配,并将结果返回给变量result1
result2 = re.search(pattern2,string)
result3 = re.search(pattern3,string)
result4 = re.search(pattern4,string)
print(result1) # 打印结果
print(result2)
print(result3)
print(result4)
# 4. 元字符——模式选择符(|,可以设置多个模式,匹配时可以从中选择任意一个模式匹配,优先匹配到先出现的)
import re
pattern = "python|php"
string = "abcdfphp345pythony_py"
result1 = re.search(pattern,string)
print(result1) # 打印结果
# 5.元字符——模式单元符'()',可以使用()将一些原子组合成一个大原子使用,小括号括起来的部分会被当做一个整体去使用
import re
pattern1 = '(cd){1,}' # 'cd'被当做一个整体去匹配,且至少出现一次,贪婪模式
pattern2 = 'cd{1,}' # d原子至少出现1次,且贪婪模式去匹配,不会把cd看做一个整体去匹配
string = "abcdcdcdcdfphp345pythony_py"
result1 = re.search(pattern1,string) # 运用re模块中的search()函数进行匹配,并将结果返回给变量result1
result2 = re.search(pattern2,string)
print(result1) # 打印结果
print(result2)

1.3 模式修正

即可以在不改变正则表达式的情况下,通过模式修正符改变正则表达式的含义,从而实现一些匹配结果的调整功能
I——匹配时忽略大小写
M——匹配多行
L——做本地化识别匹配
U——根据Unicode字符及解析字符
S——让.匹配包括换行符,即用了该模式修正后,"."既可以匹配任意字符了

import re
pattern1 = "python"
pattern2 = "python"
string = "abcdfphp345Pythony_py"
result1 = re.search(pattern1,string)
result2 = re.search(pattern2,string,re.I)#第3个参数设置了模式修正re.I,即让re.search()函数执行时忽略大小写
print(result1)#None
print(result2)

1.4 贪婪模式与懒惰模式

贪婪模式——尽可能多的匹配
懒惰模式——尽可能少的匹配
一般"p.y"默认为贪婪模式,只要在".“后加上”?"就可以转化为懒惰模式

import re
pattern1 = "p.*y" # 贪婪模式,就远原则,匹配到最远的y结尾字符才停止搜索匹配
pattern2 = "p.*?y" # 懒惰模式,就尽原则,匹配到最近的y结尾字符就停止,可以使匹配更加精确
string = "abcdfphp345pythony_py"
result1 = re.search(pattern1,string) # 运用re模块中的search()函数进行匹配,并将结果返回给变量result1
result2 = re.search(pattern2,string)
print(result1) # 打印结果 <_sre.SRE_Match object; span=(5, 21), match='php345pythony_py'>
print(result2) # 打印结果 <_sre.SRE_Match object; span=(5, 13), match='php345py'>

2 re模块常见函数

2.1 re.match()

re.match()从源字符串的起始位置匹配一个模式,使用格式:re.match(pattern,string,flag)
第一个参数代表对应的正则表达式,第二个参数代表对应的源字符,
第三个参数是可选参数,代表对应的标志位,可以放模式修正符

import re
string = "apythonhellomypythonhispythonyourpythonend"
pattern = ".python."
result = re.match(pattern,string) # 从string起始位置进行匹配,如果不满足则返回None,符合则匹配
result2 = re.match(pattern,string).span() # 将匹配到的结果在源字符中的位置赋值给result2变量
print(result)
print(result2)

2.2 re.search()

re.search()函数,会扫描整个字符串并进行对应的匹配,re.match()从源字符串的开头进行匹配,而re.search()会在全文中进行检索并匹配。

import re
string = "hellomypythonhispythonourpythonend"
pattern = ".python."
result = re.match(pattern,string) # 从源字符串的开头开始匹配
result2 = re.search(pattern,string) # 从源字符串的全文进行匹配
print(result) # None
print(result2) # ypythonh

2.3 re.findall()

全局匹配函数,re.compile()对正则表达式进行预编译,re.findall()根据正则表达式从源字符串中将匹配的结果全部找出

import re
string = "hellomypythonhispythonourpythonend"
pattern = re.compile(".python.") # 预编译
result = pattern.findall(string) # 找出符合模式的所有结果
print(result)
# 将以上代码整合优化如下
import re
string = "hellomypythonhispythonourpythonend"
pattern = ".python."
result = re.compile(pattern).findall(string)
print(result)

2.3 re.sub()

re.sub()函数,实现替换某些字符串的功能,使用格式:re.sub(pattern,rep,string,max)
第一个参数对应正则表达式,第二个参数对应要替换成的字符串
第三个参数为源字符串,第四个参数为可选项,代表最多替换的次数,若忽略不写,则会将所有符合模式的结果全部替换

import re
string = "hellomypythonhispythonourpythonend"
pattern = "python."
result = re.sub(pattern,"php",string) # 全部替换
result2 = re.sub(pattern,"php",string,2) # 最多只替换2次
print(result) # hellomyphpisphpurphpnd
print(result2) # hellomyphpisphpurpythonend

3 参考资料

  1. 《精通Python网络爬虫》
  2. re — 正则表达式操作

猜你喜欢

转载自blog.csdn.net/qq_27283619/article/details/89072775