Python通过re模块实现正则表达式,核心是编写模式字符串并使用search、match、findall、sub等函数进行查找、匹配、提取和替换操作。

Python使用正则表达式主要通过内置的
re
re
在Python里玩转正则表达式,我的经验是,首先得把
re
import re
然后,我们就可以开始干活了。最常用的几个工具大概是这样的:
re.search(pattern, string)
pattern
Match
None
立即学习“Python免费学习笔记(深入)”;
text = "我的电话是138-0013-8000,紧急联系人电话是13912345678。"
pattern = r"\d{3}-\d{4}-\d{4}" # 匹配手机号格式,r前缀表示这是一个原始字符串,避免反斜杠的转义问题
match = re.search(pattern, text)
if match:
print(f"找到了第一个电话号码: {match.group(0)}") # group(0)返回整个匹配到的字符串
# 输出: 找到了第一个电话号码: 138-0013-8000
else:
print("没找到符合格式的电话号码。")re.match(pattern, string)
search
Match
None
text_start = "Hello World!"
text_middle = "Say Hello World!"
pattern_hello = r"Hello"
match_start = re.match(pattern_hello, text_start)
match_middle = re.match(pattern_hello, text_middle)
if match_start:
print(f"从开头匹配到: {match_start.group(0)}") # 输出: 从开头匹配到: Hello
else:
print("开头未匹配到。")
if match_middle:
print(f"从开头匹配到: {match_middle.group(0)}")
else:
print("开头未匹配到。") # 输出: 开头未匹配到。re.findall(pattern, string)
findall
text_all_numbers = "商品A价格12.5元,商品B价格99.99元,商品C价格3元。"
pattern_price = r"\d+\.?\d*" # 匹配整数或小数
all_prices = re.findall(pattern_price, text_all_numbers)
print(f"所有价格: {all_prices}") # 输出: 所有价格: ['12.5', '99.99', '3']re.sub(pattern, repl, string, count=0)
pattern
repl
count
text_clean = "你好 世界! 这是一个 测试。"
pattern_spaces = r"\s+" # 匹配一个或多个空格
cleaned_text = re.sub(pattern_spaces, " ", text_clean)
print(f"清理后的文本: {cleaned_text}") # 输出: 清理后的文本: 你好 世界! 这是一个 测试。理解这几个基本函数,并掌握如何构建模式字符串,你就已经迈出了Python正则表达式的第一步。
说实话,正则表达式的“模式”才是它真正强大且让人又爱又恨的地方。刚开始学的时候,我常常被那些符号搞得头晕眼花,但一旦掌握了,你会发现它们能解决很多看似复杂的文本处理问题。这里我把我日常最常用的一些模式总结一下:
基本字符匹配:
.
\n
\d
\d
\w
\w
\s
+
\s
数量词(Quantifiers): 这些是用来指定前面那个字符或组要出现多少次的。
*
a*
""
a
aa
aaa
+
a+
a
aa
aaa
""
?
colou?r
color
colour
{n}\d{4}{n,}\d{3,}{n,m}\d{3,5}边界匹配:
^
$
\b
\bcat\b
\b
字符集:
[abc]
[aeiou]
[a-z]
[0-9]
\d
[^abc]
[^0-9]
\d
分组与捕获:
(pattern)
(ab)+
Match
match.group(1)
match.group(2)
(?:pattern)
group()
选择符:
|
cat|dog
转义:
\
.
*
?
+
(
)
[
]
{}
^
$
|
\
\.
构建这些模式的时候,我通常会先在心里模拟一下,或者直接用一些在线的正则表达式测试工具(比如regex101.com)来验证我的模式是不是真的能匹配到我想要的东西。
匹配到了结果,怎么用好它,这也有不少学问。我这里分享一些我常用的技巧和踩过的一些坑。
Match对象的妙用: 当
re.search()
re.match()
Match
match.group(0)
match.group(1)
match.group(2)
match.groups()
match.start()
match.end()
match.span()
(start, end)
text = "联系电话是: (010)1234-5678"
pattern = r"\((\d{3})\)(\d{4}-\d{4})" # 两个捕获组,一个用于区号,一个用于号码
match = re.search(pattern, text)
if match:
print(f"完整匹配: {match.group(0)}") # 输出: (010)1234-5678
print(f"区号: {match.group(1)}") # 输出: 010
print(f"号码: {match.group(2)}") # 输出: 1234-5678
print(f"所有分组: {match.groups()}") # 输出: ('010', '1234-5678')
print(f"匹配位置: {match.span()}") # 输出: (7, 22)贪婪与非贪婪匹配: 这是个经典陷阱!默认情况下,正则表达式的数量词(
*
+
?
{n,m}?
html_text = "<h1>标题1</h1><p>内容</p><h1>标题2</h1>"
greedy_pattern = r"<h1>.*</h1>" # 贪婪模式
non_greedy_pattern = r"<h1>.*?</h1>" # 非贪婪模式
greedy_match = re.search(greedy_pattern, html_text)
if greedy_match:
print(f"贪婪匹配: {greedy_match.group(0)}") # 输出: <h1>标题1</h1><p>内容</p><h1>标题2</h1>
non_greedy_match = re.search(non_greedy_pattern, html_text)
if non_greedy_match:
print(f"非贪婪匹配: {non_greedy_match.group(0)}") # 输出: <h1>标题1</h1>你看,一个
?
.*
编译正则表达式: 如果你需要在程序中多次使用同一个正则表达式模式,那么使用
re.compile()
RegexObject
phone_pattern = re.compile(r"(\d{3})-(\d{4})-(\d{4})")
text_list = ["电话: 139-1234-5678", "座机: 010-8765-4321"]
for text in text_list:
match = phone_pattern.search(text)
if match:
print(f"找到号码: {match.group(0)}")匹配标志(Flags):
re
re.IGNORECASE
re.I
re.DOTALL
re.S
.
\n
.
re.MULTILINE
re.M
^
$
^
$
multi_line_text = "First line\nSecond line"
pattern_dotall = r"First.*line"
match_dotall = re.search(pattern_dotall, multi_line_text, re.DOTALL)
if match_dotall:
print(f"DOTALL匹配: '{match_dotall.group(0)}'") # 输出: 'First line\nSecond line'处理无匹配情况: 永远要记得,
re.search()
re.match()
None
Match
match.group()
AttributeError
no_match_text = "没有数字"
pattern_digit = r"\d+"
match_obj = re.search(pattern_digit, no_match_text)
if match_obj: # 良好的编程习惯
print(f"找到了: {match_obj.group(0)}")
else:
print("什么也没找到。")掌握这些技巧,能让你在处理匹配结果时更加得心应手,避免一些不必要的错误。
正则表达式在实际开发中简直是文本处理的瑞士军刀,用途非常广泛。我个人在很多场景下都依赖它,从最简单的文本清理到复杂的数据提取。
数据验证: 这是我用得最多的场景之一。
r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"r"^1[3-9]\d{9}$"文本提取: 从非结构化或半结构化文本中抽取出你想要的信息。
<script>
文本清洗与转换: 让杂乱无章的文本变得规整。
re.sub(r"\s+", " ", text)
简单的文本搜索和替换:
我个人觉得,正则表达式的魅力在于它提供了一种模式化思维来处理文本。当你的目标文本结构有规律可循,但又不是严格的固定格式时,正则就能大显身手。不过,我也要提醒一句:不要滥用正则表达式。对于一些简单的字符串操作,比如判断一个子串是否存在(
"sub" in string
string.split(',')以上就是python怎么使用正则表达式匹配内容_python正则表达式使用指南的详细内容,更多请关注php中文网其它相关文章!
python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号