Python 3 介绍(二十)--正则表达式

目录

1. 基本概念

1.1 字符类

1.2 量词

1.3 转义字符

1.4 分组和引用

1.5 贪婪与非贪婪

2. re 模块的基本用法

2.1 导入 re 模块

2.2 常用方法

2.2.1 re.compile(pattern, flags=0)

2.2.2 re.search(pattern, string, flags=0)

2.2.3 re.match(pattern, string, flags=0)

2.2.4 re.findall(pattern, string, flags=0)

2.2.5 re.finditer(pattern, string, flags=0)

2.2.6 re.sub(pattern, repl, string, count=0, flags=0)

2.2.7 re.split(pattern, string, maxsplit=0, flags=0)

3. 示例

3.1 验证电子邮件地址

3.2 提取 HTML 标签内的文本

4. 进阶用法

4.1 条件匹配

4.2 前瞻和回顾断言

5. 总结


 

正则表达式(Regular Expressions, 简称 regex 或 regexp)是一种用于匹配字符串的强大工具。在 Python 中,正则表达式主要通过 re 模块来实现。re 模块提供了多种方法来处理正则表达式,如查找、替换、分割字符串等。

1. 基本概念

1.1 字符类

  • 普通字符:直接匹配该字符。
  • .:匹配任意一个字符(除了换行符)。
  • \d:匹配数字。
  • \w:匹配字母或数字或下划线。
  • \s:匹配空白字符。
  • [abc]:匹配字符集合中的任意一个字符。
  • [^abc]:匹配不在字符集合中的任意一个字符。

1.2 量词

  • *:匹配前面的表达式零次或多次。
  • +:匹配前面的表达式一次或多次。
  • ?:匹配前面的表达式零次或一次。
  • {m}:匹配前面的表达式恰好 m 次。
  • {m,n}:匹配前面的表达式至少 m 次,最多 n 次。

1.3 转义字符

  • \b:单词边界。
  • \B:非单词边界。
  • \A:字符串的开头。
  • \Z:字符串的结尾。
  • \z:字符串的结尾(不包括可能存在的换行符)。
  • \G:前一个匹配的结尾位置。

1.4 分组和引用

  • (...):定义一个捕获组。
  • \1:引用第 1 个捕获组的内容。
  • (?:...):非捕获组,不保存匹配结果。

1.5 贪婪与非贪婪

默认情况下,量词是贪婪的(尽可能多地匹配),加上 ? 变成非贪婪(尽可能少地匹配)。

2. re 模块的基本用法

2.1 导入 re 模块

 

python

深色版本

1import re

2.2 常用方法

2.2.1 re.compile(pattern, flags=0)

编译正则表达式模式,返回一个模式对象,可以多次使用该模式对象进行匹配。

 

python

深色版本

1pattern = re.compile(r'\d+')  # 编译模式
2result = pattern.search('abc123')  # 使用模式对象
3print(result.group())  # 输出: 123

2.2.2 re.search(pattern, string, flags=0)

在整个字符串中查找第一个匹配的位置,返回一个匹配对象。

 

python

深色版本

1match = re.search(r'\d+', 'abc123xyz')
2if match:
3    print(match.group())  # 输出: 123

2.2.3 re.match(pattern, string, flags=0)

仅在字符串的起始位置进行匹配,返回一个匹配对象。

 

python

深色版本

1match = re.match(r'\d+', '123abc')
2if match:
3    print(match.group())  # 输出: 123

2.2.4 re.findall(pattern, string, flags=0)

查找所有非重叠的匹配项,返回一个列表。

 

python

深色版本

1matches = re.findall(r'\d+', 'abc123xyz456')
2print(matches)  # 输出: ['123', '456']

2.2.5 re.finditer(pattern, string, flags=0)

查找所有非重叠的匹配项,返回一个迭代器。

 

python

深色版本

1for match in re.finditer(r'\d+', 'abc123xyz456'):
2    print(match.group())
3# 输出:
4# 123
5# 456

2.2.6 re.sub(pattern, repl, string, count=0, flags=0)

将字符串中的所有匹配项替换为指定字符串。

 

python

深色版本

1result = re.sub(r'\d+', '[REDACTED]', 'abc123xyz456')
2print(result)  # 输出: abc[REDACTED]xyz[REDACTED]

2.2.7 re.split(pattern, string, maxsplit=0, flags=0)

根据匹配项分割字符串,返回一个列表。

 

python

深色版本

1parts = re.split(r'\d+', 'abc123xyz456')
2print(parts)  # 输出: ['abc', 'xyz', '']

3. 示例

3.1 验证电子邮件地址

 

python

深色版本

1import re
2
3email_pattern = r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)"
4email = "example@example.com"
5
6if re.match(email_pattern, email):
7    print("Valid email address.")
8else:
9    print("Invalid email address.")

3.2 提取 HTML 标签内的文本

 

python

深色版本

1html = '<html><head><title>Title</title></head><body>Content here</body></html>'
2content = re.findall(r'<[^>]*>([^<>]*)</[^>]*>', html)
3print(content)  # 输出: ['Title', 'Content here']

4. 进阶用法

4.1 条件匹配

使用条件表达式 (?(id/name)yes-pattern|no-pattern) 可以根据前面的匹配结果来决定接下来的模式。

 

python

深色版本

1pattern = r'(Mr|Mrs)\.? (\w+)'
2text = 'Mr. Smith and Mrs. Jones'
3
4result = re.findall(pattern, text)
5print(result)  # 输出: [('Mr', 'Smith'), ('Mrs', 'Jones')]

4.2 前瞻和回顾断言

使用前瞻断言 (?=...) 和回顾断言 (?<=...) 可以检查位置前后是否有特定的模式,而不消耗这些字符。

 

python

深色版本

1text = "This is a sample text with some words."
2words = re.findall(r'\b\w+(?= )', text)
3print(words)  # 输出: ['This', 'is', 'a', 'sample', 'with', 'some']

5. 总结

正则表达式是 Python 中处理文本数据的强大工具,通过 re 模块可以方便地进行字符串的查找、替换、分割等操作。掌握了基本的正则表达式语法和 re 模块的方法,可以极大地提高文本处理的效率和灵活性。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值