【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 地址 |
匹配 URL | https?://[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)!