我们已经了解到正则表达式是处理字符串的强大工具,具有自己的语法结构,有了它,能实现字符串的检索、替换、匹配验证码等。
当然本文着重讲它在爬虫方向的用法,从html中提取信息。正则表达式虽然看起来一团糟,其实它也有自己的语法规范特定的规则,可以再多了解一些用法我不在赘述。
我们来了解它的常用方法。
1.match()方法
match()会从字符串的起始位置匹配正则表达式,如果匹配成功会输出匹配的结果,出错会返回None。
示例如下:
import re
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^Hello\s(\d+)\sWorld', content)
print(result)
print(result.group())
print(result.span())
运行结果:
Hello 1234567 World
(0, 19)
1
2
3
我们打印了这个输出可以看到是一个re.Match对象,这表明我们匹配成功了,该对象有两个方法group()方法可以输出正则表达式所匹配到的内容;span()方法可以输出匹配的范围。
匹配目标
我们貌似已经提取了匹配的内容。但是如果我们想要的仅仅是一段数字的电话呢?比如我们想把1234567这段数字匹配出来。这里就需要将数字部分用正则表达式括号括起来,然后再调用group(1)方法获取结果。1号索引是指数字所在的位置。
示例如下:
import re
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^Hello\s(\d+)\s(World)', content)
print(result)
print(result.group(1))
print(result.group(2)) # 我们将World括起来了也可以调用World 但如果你调用Hello它会报错
1
2
3
4
5
6
运行结果:
1234567
World
1
2
3
这里需要注意的是括号的问题!!!
通用匹配
我们上面写的正则表达式其实比较复杂,遇到数字就是\d,空白就是\s,这样匹配工作量确实不小,其实还要一种更好的方法万能匹配就是.*。
# 这里的.(点)代表的是可以匹配任意的字符*代表的是匹配前面的字符无数次。
1
有了它我们确实可以轻松不少,示例如下:
import re
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^.*$', content)
print(result)
1
2
3
4
输出结果:
1
是不是顿时简单了不少。看到这里是不是觉得多少有些疑惑看来这么久似乎并没有看到特别有用的东西,这些操作随便调用一些方法就能实现为什么还要专门学re呢?别急这仅仅是开始,如果能看完你大概就能明白!!!
贪婪与非贪婪
再使用上面.*的时候,有时可能匹配的不是我们想要的结果。
示例如下:
import re
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*(\d+).*$', content)
print(result)
print(result.group(1))
运行结果:
运行结果仅有一个7,很奇怪!
这里就是贪婪与非贪婪的问题这里的.*会尽可能的匹配多的字符。我们再He后加上了.*,后面又跟了\d+,但是并没有说\d+需要匹配多少个,所以我们的.*就将123456全部匹配了仅留下了一个7给\d+匹配。
这就是贪婪匹配,这样会给我们带来很多的不便,因此我们再字符串中间尽量使用非贪婪匹配,就是用.*?代替.*来避免出现上述情况。
示例如下:
import re
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*?(\d+).*$', content)
print(result)
print(result.group(1))
运行结果:
1234567
好的得出了我们想要的结果。
修饰符
正则表达式可以包含一些可选标识符来控制匹配的模式,修饰符被指定一个可选的标志。
示例如下:
import re
content = 'Hello 1234567 World_This \n is a Regex Demo'
result = re.match('^He.*?(\d+).*$', content)
print(result)
print(result.group(1))
1
2
3
4
5
运行结果:
None
Traceback (most recent call last):
File "C:\python_couse\project_01\spider\request_01.py", line 7, in
print(result.group(1)) 沈阳性病医院http://HdhCmsTestlnjk120测试数据/
AttributeError: 'NoneType' object has no attribute 'group'
我们添加了一个换行符就报错了,那怎样才能正确的匹配换行呢?我们可以再match传入的参数中添加一个修饰符即可。
示例如下:
import re
content = 'Hello 1234567 World_This \n is a Regex Demo'
result = re.match('^He.*?(\d+).*$', content, re.S)
print(result)
print(result.group(1))
运行结果:
1234567
查看更多关于python正则表达式re库详解的详细内容...