符号 | 含义 | 示例 | |
---|---|---|---|
. |
匹配任意单个字符(除了换行) | 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+ # 匹配一个或多个数字 |
(量词?) | 非贪婪模式,量词主要包括 * 和 + | .*? 匹配尽可能少的字符 |
text = "价格是 100 元"
match = re.search(r"\d+", text)
print(match.group()) # 输出: 100
text = "苹果 5 元,香蕉 10 元"
matches = re.findall(r"\d+", text)
print(matches) # 输出: ['5', '10']
text = "abc123"
match = re.match(r"abc", text)
print(match.group()) # 输出: abc
text = "AB"
match = re.match(r"AB", text)
print(match.group()) # 输出: AB
text = "手机号 123-456-7890"
new_text = re.sub(r"\d", "*", text) # 替换所有数字
print(new_text) # 输出: 手机号 ***-***-****
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 个字母,如 com
、net
、edu
等。
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) # 输出: "这是 一个 测试 句子。"
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"