Python for Informatics 第11章之正则表达式(四)

  • Post category:Python

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地址并打印出来。