Python中处理正则表达式的核心工具是re模块,它提供了re.match()、re.search()、re.findall()、re.finditer()和re.fullmatch()等核心函数。这些函数的区别在于匹配方式和范围:re.match()仅从字符串开头匹配,re.search()扫描整个字符串返回首个匹配,re.findall()返回所有非重叠匹配的列表,re.finditer()返回匹配对象的迭代器,re.fullmatch()要求整个字符串完全匹配。结合元字符(如.、^、$、*、+、?、[]、|、())和特殊序列(如\d、\w、\s、\b),可构建复杂模式。使用原始字符串r""能避免反斜杠转义问题。re.sub()用于替换,支持反向引用和函数替换;re.split()用正则表达式分割字符串,支持捕获组保留分隔符。为提升性能,频繁使用的模式应通过re.compile()预编译成Pattern对象。常用标志位包括re.IGNORECASE(忽略大小写)、re.MULTILINE(多行模式,^和$匹配每行首尾)和re.DOTALL(.匹配包括换行符在内的所有字符)。合理选择函数、正确使用元字符与标志位,并利用编译模式,是高效进行文本处理的关键。

re
要使用Python的
re
r"..."
re
re.search()
re.findall()
re.sub()
一个最基本的例子是查找字符串中是否包含某个单词:
import re
text = "Hello, world! Python is amazing."
pattern = r"Python"
# 使用 re.search() 查找第一个匹配项
match = re.search(pattern, text)
if match:
print(f"找到了匹配项: {match.group()}")
else:
print("没有找到匹配项。")
# 查找所有数字
numbers_text = "我今年25岁,体重65公斤,身高175厘米。"
number_pattern = r"\d+" # \d 匹配数字,+ 匹配一个或多个
all_numbers = re.findall(number_pattern, numbers_text)
print(f"找到的所有数字: {all_numbers}")在Python的
re
立即学习“Python免费学习笔记(深入)”;
首先是
re.match(pattern, string, flags=0)
Match
None
re.match()
re.match()
import re
text = "Hello World"
pattern = r"World"
match_result = re.match(pattern, text)
print(f"re.match('{pattern}', '{text}'): {match_result}") # None,因为World不在开头
pattern = r"Hello"
match_result = re.match(pattern, text)
print(f"re.match('{pattern}', '{text}'): {match_result.group() if match_result else 'None'}") # Hello接着是
re.search(pattern, string, flags=0)
re.match()
re.search()
Match
None
re.search()
re.match()
re.search()
import re
text = "The quick brown fox jumps over the lazy dog."
pattern = r"fox"
search_result = re.search(pattern, text)
print(f"re.search('{pattern}', '{text}'): {search_result.group() if search_result else 'None'}") # fox
pattern = r"cat"
search_result = re.search(pattern, text)
print(f"re.search('{pattern}', '{text}'): {search_result}") # None然后是
re.findall(pattern, string, flags=0)
re.findall()
import re
text = "Emails: test@example.com, user@domain.org, info@mail.net"
pattern = r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b"
findall_result = re.findall(pattern, text)
print(f"re.findall('{pattern}', '{text}'): {findall_result}")与
re.findall()
re.finditer(pattern, string, flags=0)
Match
re.finditer()
re.findall()
import re
text = "Numbers: 123, 456, 789"
pattern = r"\d+"
finditer_result = re.finditer(pattern, text)
for match in finditer_result:
print(f"Found number: {match.group()} at position {match.start()}-{match.end()}")最后是
re.fullmatch(pattern, string, flags=0)
re.fullmatch()
None
import re
text = "Python"
pattern = r"Python"
fullmatch_result = re.fullmatch(pattern, text)
print(f"re.fullmatch('{pattern}', '{text}'): {fullmatch_result.group() if fullmatch_result else 'None'}") # Python
text = "Python is great"
fullmatch_result = re.fullmatch(pattern, text)
print(f"re.fullmatch('{pattern}', '{text}'): {fullmatch_result}") # None总结来说,
re.match()
re.search()
re.findall()
re.finditer()
re.fullmatch()
正则表达式的强大之处在于它使用了一套特殊的字符和序列来描述复杂的文本模式,这些就是元字符(Metacharacters)和特殊序列(Special Sequences)。掌握它们是编写有效正则表达式的关键。
常用元字符:
.
\n
^
re.M
$
*
a*
a
aa
aaa
+
a+
a
aa
aaa
?
.*?
{m}m
{m,n}m
n
m
n
[]
[aeiou]
[0-9]
\d
[^abc]
a
b
c
\
\.
|
cat|dog
()
(ab)+
ab
abab
常用特殊序列:
\d
[0-9]
\d
[^0-9]
\w
[a-zA-Z0-9_]
\w
[^a-zA-Z0-9_]
\s
\s
\b
\bword\b
\b
\A
^
\Z
$
一个常见的陷阱是,当模式中包含很多反斜杠时,Python字符串的默认转义规则可能会导致混淆。这就是为什么强烈建议使用原始字符串(raw string),即在字符串前加上
r
r"\d+\s\w+"
import re
# 匹配一个或多个数字,后面跟着一个空格,再后面跟着一个或多个字母数字字符
text = "Item 123, Price 45.99, Quantity 10"
pattern = r"(\w+)\s(\d+)" # 捕获组:匹配单词和数字
matches = re.findall(pattern, text)
print(f"匹配单词和数字: {matches}") # [('Item', '123'), ('Quantity', '10')]
# 匹配一个以 'a' 开头,以 'c' 结尾,中间可以是任意字符的字符串
text = "abc, axc, ayyc, azzzc"
pattern = r"a.+c" # 贪婪匹配
print(f"贪婪匹配: {re.findall(pattern, text)}") # ['abc, axc, ayyc, azzzc']
pattern = r"a.+?c" # 非贪婪匹配
print(f"非贪婪匹配: {re.findall(pattern, text)}") # ['abc', 'axc', 'ayyc', 'azzc']
# 匹配电话号码格式 (XXX) XXX-XXXX
phone_numbers = "My phone is (123) 456-7890, and hers is (987) 654-3210."
phone_pattern = r"\(\d{3}\)\s\d{3}-\d{4}"
found_phones = re.findall(phone_pattern, phone_numbers)
print(f"找到的电话号码: {found_phones}")正则表达式不仅仅用于查找和匹配,它在文本处理中更强大的应用之一是内容的替换和分割。
re
re.sub()
re.split()
替换操作:re.sub(pattern, repl, string, count=0, flags=0)
re.sub()
pattern
repl
pattern
repl
string
count
flags
re.IGNORECASE
repl
repl
\1
\2
\g<name>
pattern
import re
text = "Date: 2023-10-26, Time: 14:30:00"
# 将日期格式从 YYYY-MM-DD 转换为 DD/MM/YYYY
# 捕获组 (YYYY), (MM), (DD)
pattern = r"(\d{4})-(\d{2})-(\d{2})"
# 使用反向引用 \3/\2/\1 来重新排列日期
replaced_text = re.sub(pattern, r"\3/\2/\1", text)
print(f"日期格式转换: {replaced_text}")
# 替换所有数字为 "[NUM]"
text_with_numbers = "Product A price is $120.50, and Product B is $99."
replaced_numbers = re.sub(r"\d+(\.\d+)?", "[NUM]", text_with_numbers)
print(f"替换数字: {replaced_numbers}")当
repl
Match
import re
# 将所有数字乘以2
def double_number(match):
# match.group(0) 获取整个匹配到的字符串
return str(int(match.group(0)) * 2)
text_for_double = "The numbers are 5, 10, and 15."
doubled_numbers = re.sub(r"\d+", double_number, text_for_double)
print(f"数字翻倍: {doubled_numbers}")分割操作:re.split(pattern, string, maxsplit=0, flags=0)
re.split()
pattern
string
pattern
string
maxsplit
flags
与字符串的
split()
re.split()
import re
# 使用多个分隔符分割字符串:逗号、分号或空格
text = "apple,banana;orange grape"
split_result = re.split(r"[,;\s]+", text) # 匹配一个或多个逗号、分号或空白字符
print(f"多分隔符分割: {split_result}")
# 如果模式中包含捕获组,那么捕获组匹配到的内容也会作为结果列表的一部分被返回
text_with_delimiters = "one<|>two<|>three"
split_with_capturing_group = re.split(r"(<\|>)", text_with_delimiters)
print(f"带捕获组分割: {split_with_capturing_group}") # ['one', '<|>', 'two', '<|>', 'three']
# 不带捕获组,分隔符不保留
split_without_capturing_group = re.split(r"<\|>", text_with_delimiters)
print(f"不带捕获组分割: {split_without_capturing_group}") # ['one', 'two', 'three']在处理文本数据时,无论是清理、格式化还是提取特定信息,
re.sub()
re.split()
re.search()
re.findall()
re
在处理正则表达式时,尤其是在一个模式需要被多次使用的情况下,理解和利用编译模式以及各种标志位(flags)能显著提升代码的效率和可读性。
编译模式:re.compile(pattern, flags=0)
当你使用
re.search()
re.findall()
re
re.compile()
re
match()
search()
findall()
sub()
import re
import time
# 不使用编译模式
start_time = time.time()
for _ in range(100000):
re.search(r"(\d{3})-(\d{3})-(\d{4})", "My phone is 123-456-7890.")
end_time = time.time()
print(f"不使用编译模式耗时: {end_time - start_time:.4f}秒")
# 使用编译模式
compiled_pattern = re.compile(r"(\d{3})-(\d{3})-(\d{4})")
start_time = time.time()
for _ in range(100000):
compiled_pattern.search("My phone is 123-456-7890.")
end_time = time.time()
print(f"使用编译模式耗时: {end_time - start_time:.4f}秒")从上面的例子可以看出,对于大量重复操作,编译模式可以带来明显的性能提升。当然,对于只使用一次的模式,直接使用
re
标志位(Flags):
标志位是用于修改正则表达式匹配行为的特殊选项。它们可以作为
re.compile()
re
flags
re.IGNORECASE
re.I
text = "Hello World"
match = re.search(r"hello", text, re.IGNORECASE)
print(f"忽略大小写匹配: {match.group() if match else 'None'}") # Hello`re.MULTIL
以上就是python如何使用正则表达式匹配_python re模块正则表达式使用指南的详细内容,更多请关注php中文网其它相关文章!
python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号