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
模块和了解正则表达式的基本语法,你可以轻松地处理各种文本任务。
