自学内容网 自学内容网

【30天玩转python】正则表达式

正则表达式

正则表达式(Regular Expression,简称 regex 或 RE)是一种用来匹配字符串的强大工具。通过定义模式,正则表达式可以帮助我们查找、替换、或验证文本中的特定字符或字符串。在 Python 中,正则表达式通过 re 模块来实现。


1. 正则表达式基础

正则表达式使用特殊的符号和字符组合来描述匹配规则。常见的正则表达式符号如下:

符号描述
.匹配任意单个字符(除换行符)
^匹配字符串的开头
$匹配字符串的结尾
*匹配前一个字符 0 次或多次
+匹配前一个字符 1 次或多次
?匹配前一个字符 0 次或 1 次
\d匹配任何数字,等价于 [0-9]
\D匹配任何非数字字符
\w匹配任何字母、数字或下划线,等价于 [a-zA-Z0-9_]
\W匹配任何非字母、非数字或非下划线的字符
\s匹配任何空白字符,包括空格、制表符等
\S匹配任何非空白字符
[]匹配括号内的任意字符
``
()用于分组和捕获

2. Python 中的 re 模块

Python 提供了内置的 re 模块来处理正则表达式。常用的函数包括:

  • re.match():从字符串开头匹配正则表达式。
  • re.search():搜索字符串中与正则表达式匹配的第一个位置。
  • re.findall():找到字符串中所有匹配的部分,并以列表返回。
  • re.sub():替换字符串中与正则表达式匹配的部分。
  • re.split():根据正则表达式分割字符串。

3. 常用正则表达式操作

3.1 re.match()

re.match() 用于从字符串的开头匹配正则表达式,如果开头不匹配则返回 None

示例:匹配数字开头的字符串

import re

pattern = r'^\d+'
text = "123abc"

match = re.match(pattern, text)
if match:
    print("匹配成功:", match.group())
else:
    print("匹配失败")

输出:

匹配成功: 123
3.2 re.search()

re.search() 会扫描整个字符串,找到第一个匹配的部分。

示例:查找字符串中的第一个数字

import re

pattern = r'\d+'
text = "Hello 123, this is a test."

search = re.search(pattern, text)
if search:
    print("找到匹配:", search.group())
else:
    print("未找到匹配")

输出:

找到匹配: 123
3.3 re.findall()

re.findall() 返回所有匹配的部分,结果以列表形式返回。

示例:查找字符串中的所有数字

import re

pattern = r'\d+'
text = "There are 3 apples, 5 bananas, and 12 oranges."

matches = re.findall(pattern, text)
print("所有匹配项:", matches)

输出:

所有匹配项: ['3', '5', '12']
3.4 re.sub()

re.sub() 用于将字符串中与正则表达式匹配的部分替换为指定的字符串。

示例:将字符串中的数字替换为 #

import re

pattern = r'\d+'
text = "My phone number is 12345"

result = re.sub(pattern, "#", text)
print(result)

输出:

My phone number is #
3.5 re.split()

re.split() 根据正则表达式分割字符串,并返回列表。

示例:根据空白字符分割字符串

import re

pattern = r'\s+'
text = "Split  this  string   by spaces."

result = re.split(pattern, text)
print(result)

输出:

['Split', 'this', 'string', 'by', 'spaces.']

4. 使用正则表达式进行验证

正则表达式常用于验证用户输入,例如邮箱、手机号等格式。

4.1 验证邮箱地址

邮箱的格式为:username@domain.com,其中 username 可以包含字母、数字、下划线,domain 是由字母和数字组成的域名,域名后缀为 .com.net.org 等。

示例:验证邮箱地址

import re

def validate_email(email):
    pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
    return re.match(pattern, email) is not None

email = "test@example.com"
if validate_email(email):
    print("邮箱格式正确")
else:
    print("邮箱格式不正确")

输出:

邮箱格式正确
4.2 验证手机号

假设我们需要验证中国大陆的手机号,规则为:以 1 开头,后跟 10 位数字。

示例:验证手机号

import re

def validate_phone(phone):
    pattern = r'^1\d{10}$'
    return re.match(pattern, phone) is not None

phone = "13812345678"
if validate_phone(phone):
    print("手机号格式正确")
else:
    print("手机号格式不正确")

输出:

手机号格式正确

5. 捕获组与非捕获组

5.1 捕获组

捕获组使用小括号 (),可以提取正则表达式匹配的子串。

示例:提取日期中的年、月、日

import re

pattern = r'(\d{4})-(\d{2})-(\d{2})'
text = "Date: 2024-09-13"

match = re.search(pattern, text)
if match:
    print("年:", match.group(1))
    print("月:", match.group(2))
    print("日:", match.group(3))

输出:

年: 2024
月: 09
日: 13
5.2 非捕获组

有时我们只想分组但不捕获结果,此时可以使用 (?:...) 来定义非捕获组。

示例:非捕获组的使用

import re

pattern = r'(?:abc)+'
text = "abcabcabc"

match = re.search(pattern, text)
if match:
    print("匹配成功:", match.group())

6. 常见正则表达式示例

场景正则表达式描述
匹配邮箱[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+匹配标准邮箱地址
匹配手机号1\d{10}匹配中国大陆 11 位手机号
匹配日期\d{4}-\d{2}-\d{2}匹配日期(格式为 yyyy-mm-dd)
匹配 IP 地址\d{1,3}(\.\d{1,3}){3}匹配 IPv4 地址
匹配 URLhttps?://[a-zA-Z0-9./?&=_-]+匹配 HTTP 或 HTTPS 开头的 URL
匹配邮政编码[1-9]\d{5}(?!\d)匹配 6 位中国邮政编码

7. 小结

  • 正则表达式是一种强大的字符串处理工具,可以用于模式匹配、字符串替换等。
  • Python 的 re 模块提供了丰富的 API 来操作正则表达式,常用的函数包括 match()search()findall()sub()split()
  • 捕获组和非捕获组能够帮助我们提取和处理字符串中的子

原文地址:https://blog.csdn.net/weixin_39372311/article/details/142374782

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!