本套课在线学习视频(网盘地址,保存到网盘即可免费观看):

https://pan.quark.cn/s/677661ea63b3

在数据解析过程中,理解正则表达式的应用对从网页源代码中提取关键信息至关重要。本文将详细介绍正则表达式的基本概念及其在实际应用中的各种语法和符号,并通过多个代码案例进行演示。

00:00 - 掌握数据解析:正则表达式、XPath与BS的应用

正则表达式的快速匹配原理

正则表达式的核心在于其快速匹配原理,主要包括以下四种语法:

  1. 单字符匹配:匹配单个字符。
  2. 多字符匹配:匹配多个字符。
  3. 开始贪婪与结束与非贪婪的语法:控制匹配的贪婪程度。
  4. 转义字符和原生字符:处理特殊字符。

工具比较

  • XPath:用于在XML和HTML文档中查找信息的语言。
  • Beautiful Soup (BS):用于解析HTML和XML文档的Python库。

正则表达式的优点

正则表达式因其速度快、准确性高而被广泛使用,尽管学习曲线较陡峭。

03:01 - 正则表达式中的元字符及其应用

元字符的特殊含义

  • 点号 (.):匹配任意一个字符(除换行符外)。
  • 数字字符 (\d):匹配任意数字,否定形式 (\D) 匹配所有非数字字符。
  • 英文字母字符 (\w):匹配所有的英文字母(含大小写)、数字及下划线,否定形式 (\W) 匹配所有非字母数字字符。
  • 空白字符 (\s):匹配空白字符如制表符、换行符等,否定形式 (\S) 匹配所有非空白字符。

代码示例

import re

# 匹配任意字符(除换行符外)
print(re.match(r".", "a"))  # True

# 匹配数字字符
print(re.match(r"\d", "1"))  # True

# 匹配非数字字符
print(re.match(r"\D", "a"))  # True

# 匹配字母、数字及下划线字符
print(re.match(r"\w", "a"))  # True

# 匹配非字母、数字及下划线字符
print(re.match(r"\W", "#"))  # True

# 匹配空白字符
print(re.match(r"\s", " "))  # True

# 匹配非空白字符
print(re.match(r"\S", "a"))  # True

07:10 - 掌握方括号在匹配中的应用

方括号的应用

方括号用于组合不同的匹配条件,满足其中任意一项即为匹配成功。

# 匹配所有的小写字母
print(re.match(r"[a-z]", "a"))  # True

# 匹配所有的大写字母
print(re.match(r"[A-Z]", "A"))  # True

# 匹配所有数字
print(re.match(r"[0-9]", "5"))  # True

# 同时匹配小写字母、大写字母和数字
print(re.match(r"[a-zA-Z0-9]", "A"))  # True
print(re.match(r"[a-zA-Z0-9]", "5"))  # True

09:07 - 正则表达式中的特殊符号及其用法

特殊符号的用法

  • 星号 (*):匹配前面的字符零次或多次。
  • 加号 (+):匹配前面的字符一次或多次。
  • 问号 (?):匹配前面的字符零次或一次。
  • 花括号 {m,n}:用于数量限定,表示匹配前面的字符至少 m 次,最多 n 次。

代码示例

# 星号匹配零次或多次
print(re.match(r"a*", ""))  # True
print(re.match(r"a*", "aaa"))  # True

# 加号匹配一次或多次
print(re.match(r"a+", "a"))  # True
print(re.match(r"a+", "aaa"))  # True

# 问号匹配零次或一次
print(re.match(r"a?", ""))  # True
print(re.match(r"a?", "a"))  # True

# 花括号匹配特定数量
print(re.match(r"a{2,4}", "aaa"))  # True
print(re.match(r"a{2,4}", "aaaa"))  # True

11:02 - 电话号码与文本匹配:贪婪与非贪婪模式

贪婪与非贪婪模式的区别

  • 贪婪模式:尽可能多地匹配字符。
  • 非贪婪模式:使用问号 (?) 实现最少匹配而非默认的最大匹配。

电话号码匹配示例

def validate_phone_number(phone_number):
    pattern = r'^1[3-9]\d{9}$'
    return re.match(pattern, phone_number) is not None

# 示例使用
print(validate_phone_number("13812345678"))  # True
print(validate_phone_number("23812345678"))  # False

综合示例

以下是一个综合示例,展示了如何使用正则表达式进行不同类型数据的验证:

def validate_data(data_type, data):
    patterns = {
        'phone': r'^1[3-9]\d{9}$',
        'email': r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$',
        'url': r'^(https?|ftp)://[^\s/$.?#].[^\s]*$',
        'id': r'^\d{17}[\dXx]$'
    }
    
    pattern = patterns.get(data_type)
    if not pattern:
        raise ValueError("Unsupported data type")
    
    return re.match(pattern, data) is not None

# 示例使用
print(validate_data('phone', '13812345678'))  # True
print(validate_data('email', 'example+test@gmail.com'))  # True
print(validate_data('url', 'https://www.example.com'))  # True
print(validate_data('id', '12345678901234567X'))  # True

通过这些示例代码,您可以更好地理解如何通过正则表达式验证手机号码、邮箱地址、网址和身份证号码。这些技术对于确保数据的准确性和安全性至关重要。