python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python正则表达式基础用法

Python正则表达式从匹配手机号到提取文本内容的基础用法详解

作者:程序员榴莲

本文介绍了Python中re模块的基本用法,包括使用re模块导入正则表达式、使用re.search查找第一个匹配项、re.match从字符串开头匹配、re.findall提取所有匹配项、re.sub替换匹配内容、re.split按多个分隔符拆分文本、re.match验证字符串格式等常见方法

在日常开发中,我们经常会遇到这类需求:

这些场景都非常适合使用正则表达式。

Python 内置的 re 模块提供了一套完整的正则工具。本文会从几个最常见的方法开始,结合示例代码,带你快速理解 Python 正则表达式的基本用法。

1. 引入 re 模块

使用正则表达式之前,需要先导入 Python 的内置模块 re

import re

re 是 regular expression 的缩写,也就是正则表达式。

它可以帮助我们按照某种规则去匹配、查找、替换或分割字符串。

2. 使用 re.search 查找第一个匹配项

假设现在有一段文本:

text = "我的手机号是 13812345678,邮箱是 test@example.com"

我们想从里面找出手机号,可以使用 re.search()

phone = re.search(r"1[3-9]\d{9}", text)

if phone:
    print(f"找到手机号:{phone.group()}")

输出结果:

找到手机号:13812345678

这里的正则表达式是:

r"1[3-9]\d{9}"

它的含义是:

所以它可以匹配类似 13812345678 这样的手机号。

需要注意的是,re.search() 只会返回第一个匹配结果。如果找到了,返回一个匹配对象;如果没找到,返回 None

因此实际使用时,通常要先判断:

if phone:
    print(phone.group())

其中 group() 用来取出真正匹配到的字符串。

3. 使用 re.search 查找邮箱

我们还可以继续从同一段文本中查找邮箱:

email = re.search(r"\w+@\w+\.\w+", text)

if email:
    print(f"找到邮箱:{email.group()}")

输出结果:

找到邮箱:test@example.com

这个正则表达式:

r"\w+@\w+\.\w+"

可以拆成几部分理解:

为什么点号要写成 \.

因为在正则表达式里,. 有特殊含义,表示“任意字符”。如果我们想匹配普通的点号,就需要用反斜杠进行转义。

4. 使用 re.findall 查找所有匹配项

re.search() 只会找第一个结果。

如果我们想找出所有匹配内容,可以使用 re.findall()

比如下面这段文本中有多个价格:

text = "价格:100元、200元、350元"
prices = re.findall(r"\d+", text)

print(prices)

输出结果:

['100', '200', '350']

这里的正则表达式是:

r"\d+"

它表示匹配一个或多个数字。

findall() 会把所有匹配到的结果放进一个列表中返回。

所以当你需要“批量提取”内容时,findall() 非常常用。

5. 使用 re.sub 替换字符串

正则不仅能查找,还能替换。

比如我们想把日期中的数字全部替换成 X

text = "今天是2026年02月19日"
result = re.sub(r"\d+", "X", text)

print(result)

输出结果:

今天是X年X月X日

re.sub() 的基本格式是:

re.sub(pattern, replacement, string)

也就是:

在这个例子中,\d+ 会匹配连续数字,所以 20260219 都会被替换成 X

6. 使用 re.split 按多个分隔符拆分字符串

普通字符串的 split() 一次通常只能按一种分隔符拆分。

但实际数据经常不那么规整,比如:

text = "张三;李四,王五 赵六"

这里的名字之间有分号、逗号和空格。

这时可以使用 re.split()

names = re.split(r"[;,\s]+", text)

print(names)

输出结果:

['张三', '李四', '王五', '赵六']

这个正则表达式:

r"[;,\s]+"

含义是:

也就是说,只要遇到分号、逗号或空白字符,就可以作为分隔符。

7. 常用正则符号速查

下面这些符号是写正则表达式时最常见的基础语法。

符号含义
.匹配任意字符,换行符除外
\d匹配数字,相当于 [0-9]
\D匹配非数字
\w匹配字母、数字、下划线
\W匹配非字母、数字、下划线
\s匹配空白字符
\S匹配非空白字符
^匹配字符串开头
$匹配字符串结尾
*匹配 0 次或多次
+匹配 1 次或多次
?匹配 0 次或 1 次
{n}匹配恰好 n 次
{n,m}匹配 n 到 m 次
[]字符集合
``
()分组

刚开始学习正则时,不需要一次性记住所有复杂语法。

先掌握 \d\w\s+*[]^$ 这些基础符号,就已经可以解决很多实际问题。

8. 实战一:验证手机号

前面我们用 search() 从文本中找手机号。

如果现在要判断一个字符串是不是完整的手机号,可以使用 re.match()

phone_pattern = r"^1[3-9]\d{9}$"

print(re.match(phone_pattern, "13812345678"))

这里的规则比前面更严格:

r"^1[3-9]\d{9}$"

其中:

加上 ^$ 之后,意味着整个字符串必须完整符合手机号格式。

如果不加它们,只要字符串中包含一段符合规则的内容,也可能被匹配到。

9. 实战二:验证邮箱

邮箱验证可以写成这样:

email_pattern = r"^[\w.+-]+@[\w-]+\.[\w.]+$"

print(re.match(email_pattern, "test@example.com"))

这个表达式支持更常见的邮箱格式:

不过要注意,真实世界中的邮箱规则非常复杂。

在业务系统中,如果只是做基础格式校验,这样的正则通常够用;如果是严肃的注册、登录或邮件投递场景,还需要结合邮件发送验证。

10. 实战三:提取 HTML 标签内容

代码中还有一个提取 HTML 标签内容的例子:

html = "<h1>标题</h1><p>段落</p>"
contents = re.findall(r"<\w+>(.*?)</\w+>", html)

print(contents)

输出结果:

['标题', '段落']

这个正则表达式是:

r"<\w+>(.*?)</\w+>"

可以这样理解:

这里的 (.*?) 很关键。

其中:

如果没有 ?,正则可能会尽可能多地匹配内容,导致结果不符合预期。

需要提醒的是,正则可以处理简单 HTML 片段,但不适合解析复杂 HTML 文档。

如果是正式爬虫或网页解析任务,更推荐使用 BeautifulSouplxml 这类专门的 HTML 解析库。

11. search、match、findall、sub、split 怎么选

可以用下面这张表快速判断:

方法用途
re.search()查找第一个匹配项
re.match()从字符串开头开始匹配
re.findall()找出所有匹配内容
re.sub()替换匹配内容
re.split()按正则规则分割字符串

简单来说:

12. 为什么正则字符串前面常加 r

你会发现示例中的正则表达式大多写成这样:

r"\d+"

前面的 r 表示原始字符串。

它可以减少反斜杠转义带来的困扰。

比如正则中的 \d 表示数字,如果不用原始字符串,在更复杂的表达式中就很容易遇到双重转义问题。

所以写 Python 正则时,一个好习惯是:

正则表达式尽量使用 r"..." 这种原始字符串形式。

小结

本文从几个常见例子出发,介绍了 Python re 模块的基础用法。

核心内容包括:

正则表达式刚开始看起来有点像“符号密码”,但它的核心思想其实很简单:

用一套规则去描述你想匹配的字符串。

当你掌握了常用符号和几个基础方法之后,就可以用正则快速完成很多文本处理任务。

以上就是Python正则表达式从匹配手机号到提取文本内容的基础用法详解的详细内容,更多关于Python正则表达式基础用法的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文