PythonforInformatics第11章之正则表达式(四)
在PythonforInformatics第11章中,我们学习了如何使用Python中的re模块进行正则表达式操作。本文将详细讲解第11章的内容,包括正则表达式的基本语法、re模块的常用函数、正则表达式的高级用法以及两个示例说明。
正则表达式的基本语法
正则达式是一用于匹配字符串的模式。在Python中,正则表达式的基本语法如下:
- 字符:匹配该字符本身。
- .:匹配任意一个字符。
- []:匹配方括号中的任意一个字符。
-^]:匹配不在方括号中的任意一个字符。 - *:匹配前面的字符零次或多次。
- +:匹配前面的字符一次或多次。
- ?:匹配前面的字符零次或一次。
- {m,n}:匹配前面的字符m次到n次。
- ():将括号中的内容作为一个分组。
re模块的常用函数
在Python中,re模块提供了多个函数用于正则表达式操作。其中,常用的函数包括:
- re.search(pattern, string, flags=0):在字符串中搜索正则表达式的第一个匹配项。
- re.match(pattern, string, flags=0):从字符串的开头开始匹配正则表达式。
- re.findall(pattern, string, flags=0):在字符串中查找所有匹配正则表达式的子串,并返回一个列表。
- re.sub(pattern, repl, string, count=0, flags=0):使用repl替换字符串中所有匹配正则表达式的子串,并返回替换后的字符串。
正则表达式的高级用法
在Python中,正则表达式还有一些高级用法,包括:
- 贪婪匹配和非贪婪匹配:默认情况下,正则表达式是贪婪匹配的,即尽可能多地匹配字符。可以使用?将其改为非贪婪匹配。
- 正则表达式的分组:可以使用()将正则表达式的一部分作为一个分组,并在后面的操作中引用该分组。
- 正则表达式的预搜索:可以使用?=和?!进行正则表达式的预搜索,即匹配某个式前面或后面的内容。
示例一
以下是一个示例,用于展示如何使用正则表达式从HTML页面中提取链接:
import re
import requests
# 从HTML页面中提取所有链接
url = "http://www.example.com"
response = requests.get(url)
html = response.text
pattern = re.compile("<a href=\"(.*?)\">")
links = pattern.findall(html)
for link in links:
print(link)
在上面的示例中,我们使用requests库获取一个HTML页面,并将其存储在html变量中。然后,使用re模块的findall()函数和正则表达式”“从HTML页面中提取所有链接,并将结果存储在links变量中。最后,使用for循环遍历所有链接并打印出来。
示例二
以下是一个示例,用于展示如何使用正则表达式从日志文件中提取所有IP地址:
import re
# 从日志文件中提取所有IP地址
with open("access.log", "r") as f:
log = f.read()
pattern = re.compile("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")
ips = pattern.findall(log)
for ip in ips:
print(ip)
在上面的示例中,我们使用Python的文件操作打开一个日志文件,并将其存储在log量中。然后,使用re模块的findall()函数和正则表达式”\d{1,3}.\d{1,3}.\d{1,}.\d{1,3}”从日志文件中提取所有IP地址,并将结果存储在ips变量中。最后,使用for循环遍历所有IP地址并打印出来。