Python 正则表达式 re 包
一、常见正则表达式符号
符号 | 含义 | 示例 | |
---|---|---|---|
. | 匹配任意单个字符(除了换行) | r"a.c" 可匹配 "abc" 、"a1c" 等 | |
\d | 匹配任何数字(0-9) | r"\d+" 匹配 "123" 、"56" | |
\w | 匹配字母、数字或下划线 | r"\w+" 匹配 "hello_123" | |
\s | 匹配空格、制表符等 | r"\s+" 匹配 " " | |
\b | 匹配单词边界 | r"\bcat\b" 匹配 " cat "不匹配"category" | |
\B | 匹配非单词边界 | r"\Bcat\B" 匹配 "category"不匹配" cat " | |
^ | 匹配字符串开头 | r"^abc" 只能匹配 "abc" 开头的字符串 | |
$ | 匹配字符串结尾 | r"xyz$" 只能匹配 "xyz" 结尾的字符串 | |
* | 匹配 零次或多次 | r"ab*" 可匹配 "a" 、"ab" 、"abb" | |
+ | 匹配 一次或多次 | r"ab+" 匹配 "ab" 、"abb" ,但不匹配 "a" | |
? | 匹配 零次或一次 | r"ab?" 匹配 "a" 或 "ab" | |
{n} | 匹配 指定次数 | r"\d{4}" 匹配 "2024" | |
` | ` | 逻辑 或 | |
() | 分组匹配 | r"(abc)+" 匹配 "abc" 、"abcabc" |
二、基础函数功能
re.search():查找第一个匹配项,没有返回 None
text = "价格是 100 元"
match = re.search(r"\d+", text)
print(match.group()) # 输出: 100
re.findall():查找所有匹配项,没有返回空list
text = "苹果 5 元,香蕉 10 元"
matches = re.findall(r"\d+", text)
print(matches) # 输出: ['5', '10']
re.match():匹配字符串开头,没有返回 None
text = "abc123"
match = re.match(r"abc", text)
print(match.group()) # 输出: abc
re.sub():替换匹配项
text = "手机号 123-456-7890"
new_text = re.sub(r"\d", "*", text) # 替换所有数字
print(new_text) # 输出: 手机号 ***-***-****
re.compile():预编译正则
pattern = re.compile(r"\d+")
matches = pattern.findall("价格是 50 元")
print(matches) # 输出: ['50']
三、常用案例
邮箱格式校验
import redef is_valid_email(email):pattern = r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"return bool(re.match(pattern, email))email = "test@example.com"
print(is_valid_email(email)) # 输出: True
这是匹配邮箱地址的 正则表达式,我们拆解一下:
-
^
:匹配字符串开头。 -
[a-zA-Z0-9._%+-]+
:邮箱的用户名部分,允许 字母、数字、点(.)、下划线(_)、百分号(%)、加号(+)、减号(-)。 -
@
:邮箱必须包含@
符号。 -
[a-zA-Z0-9.-]+
:域名部分,允许 字母、数字、点(.)和连字符(-)。 -
\.
:必须包含.
(点),表示域名后缀。 -
[a-zA-Z]{2,}$
:邮箱后缀(如.com
、.org
),要求至少 2 个字母,如com
、net
、edu
等。
提取网页中的所有 URL
import retext = "访问 https://example.com 和 http://test.com 获取更多信息。"
urls = re.findall(r"https?://[a-zA-Z0-9./_-]+", text)
print(urls) # 输出: ['https://example.com', 'http://test.com']
匹配电话号码
import redef extract_phone_numbers(text):pattern = r"\b\d{3}-\d{4}-\d{4}\b"return re.findall(pattern, text)text = "我的号码是 123-4567-8901,你的号码是 987-6543-2100。"
print(extract_phone_numbers(text)) # 输出: ['123-4567-8901', '987-6543-2100']
这是一条用于匹配 电话号码 的 正则表达式:
-
\b
:单词边界,确保匹配的电话号码是一个独立的文本片段,而不是嵌在其他字符中。 -
\d{3}
:匹配 三个数字(区号或首部分,如123
)。 -
-
:匹配 连字符-
。 -
\d{4}
:匹配 四个数字(电话号码的中间部分,如4567
)。 -
-
:匹配 连字符-
。 -
\d{4}
:匹配 四个数字(电话号码的最后部分,如8901
)。 -
\b
:单词边界,确保完整匹配。
这套正则表达式要求电话号码的格式必须是 “xxx-xxxx-xxxx”,否则不会匹配。
去除多余的空格
import retext = "这是 一个 测试 句子。"
clean_text = re.sub(r"\s+", " ", text)
print(clean_text) # 输出: "这是 一个 测试 句子。"
提取 HTML 标签中的内容
import rehtml = "<div>Hello, <b>World</b>!</div>"
content = re.findall(r"<.*?>(.*?)<.*?>", html)
print(content) # 输出: ['Hello, ', 'World']
-
.*
是 贪婪匹配,会匹配尽可能多的字符。 -
.*?
是 非贪婪匹配,只匹配最小范围的字符,直到遇到>
关闭标签。