Python
標準函式庫
正規表示式 - re
基本

Python正则表达式(re模块):match, search, sub, findall, replace, examples

这篇文章是对re模块的简单解释,这是Python的一个正则表达式模块。 最好的教程永远是官方的 Python 文档。 这篇文章将让你开始学习,然后你可以阅读官方文档以了解情况。让我们开始吧!

1. 什么是正则表达式?

正则表达式,通常被称为Regex,或者韩语中的re,是一种使用一组符号来定义搜索模式的方法。 正则表达式允许你非常灵活和快速地操作和查找文本模式,使它们成为每个程序员都应该在他们的武器库中拥有的强大工具。

Python 内置的 re 模块提供了一种强大而有效的方法来处理正则表达式。 由于它是一个内置模块,你不需要安装它,你可以通过import来使用它,如下所示。

import re

2. 正则表达式的符号列表

Python正则表达式的形式是r"[regex_pattern],带有一个原始字符串。 例如,要找到所有以"python"字符开始的字符串,可以使用regex模式r"^python"

这里是我们用来定义正则表达式模式的基本regex符号。 我把它们分成几类,以使它们更容易记住。

  • .:表示任何字符(除换行外)。

2.1.一个字符串的开头和结尾(边界锚)。

  • ^:表示一个字符串的开始。
  • $: 表示一个字符串的结束。

2.2. 字符串的数量(量词)

  • ?: 表示没有或有一个前面的字符。
  • *: 没有前面的字符或一个或多个前面的字符。
  • +:表示一个或多个前面的字符。
  • {n}:表示前面的字符正好出现n次。
  • {n,}:表示前面的字符出现n次以上。
  • {n,m}:表示前面的字符出现n次和m次之间。

2.3. 字符串格式(字符类和字符集)

  • \d:表示所有数字。
  • \D:表示除数字以外的所有字符。
  • \S:指由空格、t、n、r、f、v产生的所有空格。
  • \S:表示没有空格。
  • \W:指所有字母和数字,_。
  • \W: 意味着所有的字母、数字和除_以外的所有字符。
  • .: 意味着所有的字符,除了n。
  • []: 所有被括在方括号内的字符。

2.4. 逻辑运算符

  • (abc): 这是一个分组运算符,即大括号内的字符组以原样出现。
  • [^abc]: 一个集合运算符,即除大括号中的字符外,其他所有字符都会出现。
  • (A|B): OR运算符,意味着A或B都会出现。

3. re模块函数基础知识

Python re模块提供了许多用于处理正则表达式的函数。下面列出了最常用的函数。

这些函数的使用模式由 Section 4 中的例子来说明。

  • re.match(): 检查一个字符串开头的正则表达式模式是否匹配。
import re
 
pattern = r"Hello"
text = "Hello, World!"
 
match = re.match(pattern, text)
if match:
    print("Match found!")
else:
    print("No match found.")
 
# Output: Match found!
  • re.search(): 检查整个字符串是否与正则表达式模式匹配。
import re
 
pattern = r"World"
text = "Hello, World!"
 
search = re.search(pattern, text)
if search:
    print("Match found!")
else:
    print("No match found.")
 
# Output: Match found!
  • re.findall(): 将一个字符串中所有不重叠的正则表达式模式作为字符串列表返回。
import re
 
pattern = r"\d+"
text = "I have 3 apples and 5 oranges."
 
matches = re.findall(pattern, text)
print(matches)
 
# Output: ['3', '5']
  • re.finditer(): 返回一个迭代器,用于匹配一个字符串中所有不重叠的正则表达式模式。
import re
 
pattern = r"\d+"
text = "I have 3 apples and 5 oranges."
 
matches_iter = re.finditer(pattern, text)
for match in matches_iter:
    print(match.group(), end=" ")
 
# Output: 3 5
  • re.sub(): 用指定的替换字符串替换一个字符串中所有出现的正则表达式模式。
import re
 
pattern = r"apple"
text = "I have an apple. It is a delicious apple."
 
new_text = re.sub(pattern, "orange", text)
print(new_text)
 
# Output: I have an orange. It is a delicious orange.
  • re.split(): 根据正则表达式模式的出现次数来分割字符串。
import re
 
pattern = r"\s+"
text = "Hello   World!   How are you?"
 
substrings = re.split(pattern, text)
print(substrings)
 
# Output: ['Hello', 'World!', 'How', 'are', 'you?']

4. re模块函数的例子

现在re模块函数已经很熟悉了,让我们看看它们的一些实际使用例子:

###例1: 查找文本中的所有电子邮件地址 假设你有一个包含多个电子邮件地址的文本,你想把它们全部提取出来。 下面是如何使用re.findall()函数来实现的:

import re
 
text = "Contact us at info@example.com or support@example.org for any inquiries."
email_pattern = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
emails = re.findall(email_pattern, text)
 
print(emails)  # Output: ['info@example.com', 'support@example.org']

例2: 用一个替换字符串替换文本中的URLs

假设你有一些包含多个URL的文本,你想用一个替换字符串来替换它们,例如[URL]。 你可以使用re.sub()函数来完成这个任务:

import re
 
text = "Visit our website at https://example.com and check our blog at https://blog.example.com."
url_pattern = r"https?://[^\s]+"
replaced_text = re.sub(url_pattern, "[URL]", text)
 
print(replaced_text)  # Output: Visit our website at [URL] and check our blog at [URL].

示例3:从不同的格式中提取电话号码

让我们使用re.finditer()函数从不同的文本格式中提取电话号码。

import re
 
text = "Call John at (123) 456-7890 or reach Jane at 987-654-3210 for more information."
phone_pattern = r"\(?\d{3}\)?[-\s]?\d{3}[-\s]?\d{4}"
phone_numbers = [match.group() for match in re.finditer(phone_pattern, text)]
 
print(phone_numbers)  # Output: ['(123) 456-7890', '987-654-3210']

例四:验证密码

在这个例子中,我们将检查用户输入的密码是否符合以下条件:至少有一个大写字母,至少有一个小写字母,至少有一个数字,并且总共至少有八个字符。 我们将使用re.search()来完成这项任务。

import re
 
def is_valid_password(password):
    if len(password) < 8:
        return False
    if not re.search(r"[A-Z]", password):
        return False
    if not re.search(r"[a-z]", password):
        return False
    if not re.search(r"\d", password):
        return False
    return True
 
password = "P4ssw0rd!"
print(is_valid_password(password))  # Output: True

例子 5: 基于多个符号分割一个字符串

在这个例子中,我们将使用re.split()函数根据多个分隔符(逗号、分号、管道)来分割一个字符串:

import re
 
text = "apple,banana;orange|grape"
delimiter_pattern = r"[,;|]"
fruits = re.split(delimiter_pattern, text)
 
print(fruits)  # Output: ['apple', 'banana', 'orange', 'grape']

5. 更进一步

除了基本的regex语法和函数,还有其他值得探索的regex主题。

  • 前视和后视断言: 如何为一个给定的正则表达式模式注册额外的模式。
  • 命名集和反向引用: 如何在正则表达式中使用类似于层次结构和变量的技术。
  • 非抓取组: 一种使用组来搜索模式的技术,但忽略了它们的值。

你还会学到其他有用的技术,如不区分大小写的搜索、多行模式等等。

6. 使用re模块的提示

这里有一些提示和技巧,使使用正则表达式更容易:

  • 在你的正则表达式模式中使用原始字符串 (r""),以避免转义反斜线。 在 Python 中为正则表达式使用反斜线需要转义,但使用原始字符串就不需要了。
  • Regex101 是一个方便的在线工具,用于测试和调试正则表达式模式。一旦你掌握了它,你就会一直使用它。
  • 创建一个复杂的正则表达式模式是很难阅读和管理的;把它分成更小的、更容易管理的单元,使它更容易阅读和维护。
  • 使用注释和verbose模式(re.VERBOSE)可以使正则表达式模式更容易理解。 它可以与 re.compile()结合使用,以增加粗略的注释。

7. 最后的想法

正则表达式是Python中进行文本操作和模式匹配的强大工具。 通过熟悉re模块和了解正则表达式的基本语法,你可以轻松地处理各种文本任务。

copyright for Python re basics

© 2023 All rights reserved.