由于需要做毕设的网络爬虫部分,有许多之前学的部分很多都没有彻底吃透,现在又回炉重做,学了一下正则表达式。
常用的匹配规则:(这个记忆还是有问题,有些简单的还是可以记住的,还是需要经常翻阅)
\w 匹配字母、数字、下划线,等价于[a-z|A-Z|0-9] \w可以匹配汉字(python),
\W 匹配不是字母、数字、下划线的其他字符
\s 匹配任意空白字符,等价于(\t\n\r\f)
\S 匹配任意非空字符
\b 字符边界,匹配空格,标点符号或者换行符,只匹配一个位置
\d 匹配数字,等价于[0-9]
\D 匹配不是数字的字符
\A 匹配字符串开头
\Z 匹配字符串结尾的,如果存在换行,只匹配到换行前的结束字符串
\z 匹配字符串结尾的,如果存在换行,同时匹配换行符
\G 匹配最后完成匹配的位置
\n 匹配一个换行符
\t 匹配一个制表符(tab)
^ 匹配一行字符串的开头
$ 匹配一行字符串的结尾
. 匹配任意字符,除了换行符.当re.DOTALL标记被指定时,这可以匹配包括换行符在内的任字符
[…] 用来表示一组字符,比如[abc]表示匹配a或b或c,[a-z],[0-9]
[^…] 匹配不在[]里面的字符,比如[^abc]匹配除a,b,c以外的字符
* 匹配0个或多个字符
+ 匹配1个或多个字符
? 匹配0个或1个前面的正则表达式片段
?P<name>命名一个name的组
?i 不区分大小写
?=* 匹配*前面的字段
?!* 不匹配*
?:* 匹配*
?<=* 匹配*后面的字段
?<!* 不匹配*
{n} 精确匹配前面n个前面的表达式,如\d{5}表示匹配5个数字
{n,m} 匹配前面的表达式n到m次,贪婪模式
a|b 匹配a或者b
(…) 匹配括号里的表达式,也可以表示一个组
常用组合匹配规则:
.*:匹配0个或多个出换行符以外的任意字符
.*?:表示尽可能少地匹配字符(感觉这个3个字符匹配一切)
re.match()
语法:
re.match(pattern,string,modifier),
其中pattern是正则表达式,string是要匹配的字符串,modifier是修饰符控制正则的匹配方式。
示例:
import re
string = 'Hello World! My Name is fz'
pattern = '^Hello\s\S\S\S\S\S\S'
result = re.match(pattern,string)
print(result)
输入结果:<re.Match object; span=(0, 12), match='Hello World!'>
#span() :输出匹配的范围
下面来介绍modifier,也就是修饰符
re.I:使得匹配不区分大小写
re.L:做本地化识别匹配
re.M:多行匹配,对匹配开头^和结尾$有影响
re.S:使得.匹配包括换行符在内的所有字符(这个好像比较常用,可以记忆)
re.U:根据Unicode字符集解析字符
re.X:赋予更灵活的格式有助于正则表达式的理解
示例:
import re
string = '''Hello World!
My Name is fz
teleponeNumber is 1111111
'''
pattern = '^Hello.*?is(.*?)teleponeNumber.*?(\d+)'
result = re.match(pattern,string,re.S)
strResult = result.group()
strResultSecond = result.group(1)
strResultThird = result.group(2)
print(strResult)
print(strResultSecond)
print(strResultThird)
运行结果是:Hello World!
My Name is fz
teleponeNumber is 1111111
fz
1111111
注意:本来楼主写的时候加了\s换行符,结果出错,由于加了re.S的模式,就不需要考虑换行的问题。
转义符:\
说明:当匹配字符串中包含匹配符时,需要转义使其不产生匹配的作用。
示例:
import re
string = "Hello World! My Name is fz(论文真难写) I'm hanhan"
pattern = '^He.*?\(论文真难写\)'
result = re.match(pattern,string)
strResult = result.group()
print(strResult)
运行结果:Hello World! My Name is fz(论文真难写)
注意:^匹配时前面字符不一定要写全。
re.search()
说明:与match区别在于,match从头开始匹配,一旦字符串开始位置不符合正则表达式就会匹配失败;search匹配整个字符串。
示例:
import re
string = "Hello World! My Name is fz(论文真难写) I'm hanhan"
pattern = 'My.*?\(论文真难写\)'
result = re.search(pattern,string)
strResult = result.group()
print(strResult)
运行结果:My Name is fz(论文真难写)
re.findall()
说明:当被匹配的字符串中有多个符合正则表达式时,使用re.findall()可以获得符合正则表达式的所有内容。
示例:
import re
string = """
Hello World! My Name is fz(论文真难写) I'm hanhan
Hello World! My Name is fz(python很强) I'm hanhan
Hello World! My Name is fz(爬虫好难) I'm hanhan
"""
pattern = 'My.*?fz\(.*?\)\s'
result = re.findall(pattern,string,re.S)
for num in result:
print(num)
运行结果:My Name is fz(论文真难写)
My Name is fz(python很强)
My Name is fz(爬虫好难)
re.sub()
语法:
re.sub(pattern,replace,string),
其中pattern是被替代的字符的正则表达式,replace是用于替换的字符,string是要匹配的字符串。
说明:sub()的意义在于可以快速对匹配的字符串进行处理,比如去除掉字符串中的数字字符。
示例:
import re
string = 'Hello World!My Name is fz.TeleponeNumber is 1111111'
pattern = '\d+'
replace = "10086"
result = re.sub(pattern,replace,string,re.S)
print(result)
运行结果:Hello World!My Name is fz.TeleponeNumber is 10086
re.compile()
说明:compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
语法:
re.compile(pattern,modifier),
其中pattern是正则表达式,modifier是修饰符。
示例:
import re
string = 'noneone123haha90'
pattern=re.compile('\d+')
m=pattern.match(string)
print(m)
运行结果:None
import re
string = 'noneone123haha90'
pattern=re.compile('\d+')
m=pattern.match(string,7,14)
print(m)
print(m.group())
print(m.start())
print(m.end())
print(m.span())
运行结果:<re.Match object; span=(7, 10), match='123'>
123
7
10
(7, 10)