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"
{m,n} 匹配 一定范围内次数 r"\d{2,4}" 匹配 "20" "202" "2024"
` ` 逻辑
() 分组匹配 r"(abc)+" 匹配 "abc""abcabc"

高阶

符号 含义 示例
(?=X)

正向预查,用于判断格式

但不消耗字符

r"foo(?=bar)" 匹配 "foo",但要求其后紧跟 "bar"
(?s) 启用单行模式 r"(?s).*" 匹配任意字符,包括换行符
(?i) 忽略大小写 (?i)hello 匹配 Hello hello hEllo
(?x) 忽略空白字符和允许注释 (?x) \d+ # 匹配一个或多个数字
(量词?) 非贪婪模式,量词主要包括 * 和 + .*? 匹配尽可能少的字符

二、基础函数功能

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.fullmatch(): 完全匹配 一个字符串,没有返回 None

text = "AB"
match = re.match(r"AB", text)
print(match.group())  # 输出: AB

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 re

def 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 = "[email protected]"
print(is_valid_email(email))  # 输出: True

这是匹配邮箱地址的 正则表达式,我们拆解一下:

  • ^:匹配字符串开头。

  • [a-zA-Z0-9._%+-]+:邮箱的用户名部分,允许 字母、数字、点(.)、下划线(_)、百分号(%)、加号(+)、减号(-)

  • @:邮箱必须包含 @ 符号。

  • [a-zA-Z0-9.-]+:域名部分,允许 字母、数字、点(.)和连字符(-)

  • \.:必须包含 .(点),表示域名后缀

  • [a-zA-Z]{2,}$:邮箱后缀(如 .com.org),要求至少 2 个字母,如 comnetedu 等。

提取网页中的所有 URL

import re

text = "访问 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 re

def 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 re

text = "这是    一个    测试   句子。"
clean_text = re.sub(r"\s+", " ", text)
print(clean_text)  # 输出: "这是 一个 测试 句子。"

提取 HTML 标签中的内容

import re

html = "
Hello, World!
" content = re.findall(r"<.*?>(.*?)<.*?>", html) print(content) # 输出: ['Hello, ', 'World']
  • .*贪婪匹配,会匹配尽可能多的字符。

  • .*?非贪婪匹配,只匹配最小范围的字符,直到遇到 > 关闭标签。

单选、多选答案匹配

import re

pattern = r"(?=[ABCD])A?B?C?D?"
content = re.fullmatch(pattern, "ABC")
print(content.group())  # 输出: "ABC"
  • ?=[ABCD] 正向预查,至少包含一个A-D的任意一个字符
  • A?B?C?D? 保持A-D字符的顺序约束,且每个字符最多出现一次。

你可能感兴趣的:(Python,python,开发语言)