正则表达式介绍和python中的简单使用
正则表达式(Regular Expression, 简称 RegEx)
正则表达式是一种用来描述字符串模式的工具,它允许你根据特定的规则来搜索、匹配、替换字符串。正则表达式通过一些特殊的符号和规则来描述字符串的匹配模式,常用于文本搜索、替换、验证和提取。
Python 提供了 re
模块来支持正则表达式的使用,允许用户进行模式匹配、搜索、替换等操作。
正则表达式的基本组成部分
正则表达式包括以下几类常见元素:
1. 元字符(Metacharacters)
元字符是正则表达式中具有特殊含义的字符,它们通常用于定义模式匹配的规则。
.
:匹配除换行符以外的任何字符。^
:匹配字符串的开始。$
:匹配字符串的结束。*
:匹配前面的元素零次或多次。+
:匹配前面的元素一次或多次。?
:匹配前面的元素零次或一次。{n}
:匹配前面的元素恰好 n 次。{n,}
:匹配前面的元素至少 n 次。{n,m}
:匹配前面的元素至少 n 次,但不超过 m 次。[]
:匹配方括号中的字符集中的任何一个字符(字符集)。|
:表示"或"的意思,匹配左右任意一个表达式。()
:用于分组匹配,提取匹配的部分。
2. 常见的字符集(Character Classes)
\d
:匹配任何数字,等价于[0-9]
。\D
:匹配任何非数字字符,等价于[^0-9]
。\w
:匹配任何字母数字字符或下划线,等价于[a-zA-Z0-9_]
。\W
:匹配任何非字母数字字符,等价于[^a-zA-Z0-9_]
。\s
:匹配任何空白字符(包括空格、制表符、换行符等)。\S
:匹配任何非空白字符。\b
:匹配单词边界。\B
:匹配非单词边界。
3. 贪婪和非贪婪匹配
- 贪婪匹配(Greedy Match):尽可能多地匹配字符。例如,
.*
会尽量匹配尽可能多的字符。 - 非贪婪匹配(Non-Greedy Match):尽可能少地匹配字符。通过在量词后加
?
来实现。例如,.*?
会尽量匹配少量的字符。
常见的正则表达式例子
以下是一些常见的正则表达式及其用途:
1. 匹配电话号码
假设你要匹配常见格式的电话号码,如 (123) 456-7890
,你可以使用如下正则表达式:
\(\d{3}\)\s\d{3}-\d{4}
\(
和\)
匹配括号字符。\d{3}
匹配三个数字。\s
匹配空白字符(通常是空格)。-
匹配连字符。
2. 匹配邮箱地址
匹配简单的邮箱地址,如 user@example.com
,可以使用:
[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
[a-zA-Z0-9._%+-]+
匹配用户名部分,支持字母、数字、点、下划线、百分号等字符。@
匹配@
符号。[a-zA-Z0-9.-]+
匹配域名部分。\.
匹配点号。[a-zA-Z]{2,}
匹配域名的后缀,至少包含两个字母。
3. 匹配网址(URL)
匹配网址(如 https://www.example.com
)的正则表达式可以是:
https?://(?:www\.)?[a-zA-Z0-9-]+\.[a-zA-Z]{2,}
https?
匹配 “http” 或 “https”,?
表示可选。://
匹配 “😕/”。(?:www\.)?
是一个非捕获组,匹配可选的 “www.”,其中?
表示这一部分是可选的。[a-zA-Z0-9-]+
匹配域名部分,由字母、数字或短横线组成。\.
匹配点(.
)字符。[a-zA-Z]{2,}
匹配顶级域名(如.com
、.org
),至少包含两个字母。
4. 匹配日期格式(YYYY-MM-DD)
假设你要匹配日期格式,如 2024-12-31
,可以使用:
\d{4}-\d{2}-\d{2}
\d{4}
匹配四个数字(表示年份)。-
匹配连字符。\d{2}
匹配两位数字(表示月份或日期)。
5. 匹配身份证号(中国身份证)
中国的身份证号码通常为 18 位数字(可能包括字母 X)。一个常见的正则表达式是:
\d{17}[\dXx]
\d{17}
匹配前 17 位数字。[\dXx]
匹配最后一位数字或字母 “X”(大小写均可)。
6. 匹配空白字符
匹配一个或多个空白字符(空格、制表符、换行符等):
\s+
\s
匹配任意空白字符。+
表示匹配一个或多个。
7. 匹配所有数字
匹配一个或多个数字:
\d+
\d
匹配一个数字。+
表示匹配一个或多个。
8. 匹配电话号码(简单格式)
匹配形如 123-456-7890
的电话号码:
\d{3}-\d{3}-\d{4}
\d{3}
匹配三位数字。-
匹配连字符。\d{4}
匹配四位数字。
9. 匹配IP地址
匹配IPv4地址,如 192.168.0.1
:
\b(?:\d{1,3}\.){3}\d{1,3}\b
\b
匹配单词边界,确保它是一个完整的 IP 地址。(?:\d{1,3}\.){3}
匹配三段数字,每段数字可以是 1 至 3 位,后面跟一个点号。\d{1,3}
匹配最后一段数字。
10. 匹配重复字符
查找重复的单个字符,例如两个连续的字母 aa
、bb
、cc
等:
(\w)\1
(\w)
捕获一个字母或数字。\1
引用第一个捕获组,确保后面的字符与第一个字符相同。
11. 匹配HTML标签
如果你想匹配 HTML 标签(如 <div>
, </p>
),可以使用:
<[^>]+>
<
和>
匹配 HTML 标签的尖括号。[^>]
匹配任何非>
字符,+
表示匹配一个或多个。
Python 中使用正则表达式
Python 提供了 re
模块来工作与正则表达式。常见的操作包括:
1. 匹配字符串
使用 re.match()
或 re.search()
来检查字符串是否符合正则表达式。
import re
# re.match() 匹配字符串的开始
result = re.match(r'\d{4}-\d{2}-\d{2}', '2024-12-31')
if result:
print('匹配成功')
else:
print('匹配失败')
# re.search() 在字符串中查找第一次匹配
result = re.search(r'\d{4}-\d{2}-\d{2}', 'Today is 2024-12-31')
if result:
print(f"找到匹配的日期:{result.group()}")
else:
print('没有找到匹配')
2. 查找所有匹配项
如果你需要找出字符串中所有的匹配项,可以使用 re.findall()
:
import re
text = "My phone numbers are 123-456-7890 and 987-654-3210."
matches = re.findall(r'\d{3}-\d{3}-\d{4}', text)
print(f"找到的电话号码:{matches}")
3. 替换字符串中的内容
使用 re.sub()
来替换字符串中的匹配项:
import re
text = "My email is user@example.com"
replaced_text = re.sub(r'\S+@\S+', 'hidden@example.com', text)
print(f"替换后的文本:{replaced_text}")
4. 分割字符串
你可以使用 re.split()
来按照正则表达式的匹配项分割字符串:
import re
text = "apple,orange;banana|grape"
fruits = re.split(r'[;|,]', text)
print(f"分割后的水果:{fruits}")
5. 匹配多个条件
你可以组合多个条件来进行复杂的匹配。比如,匹配一个有效的日期(YYYY-MM-DD
):
import re
date_pattern = r'^\d{4}-\d{2}-\d{2}$'
dates = ["2024-12-31", "12-31-2024", "2024-2-30"]
valid_dates = [date for date in dates if re.match(date_pattern, date)]
print(f"有效的日期:{valid_dates}")
具体使用时,还需要根据正则的基础语法进行拼接和使用,欢迎大家留言讨论。