问题: 正则表达式中^和#符号的作用是什么?
👇 点击展开/折叠 面试背诵模板(建议先背这个)
`^`在正则中有两种作用:作为**行首锚定**,匹配字符串或行的起始位置;在字符类`[^]`中作为**取反符号**,表示匹配除指定字符外的任意字符。`#`在普通正则中无特殊含义,仅匹配字面量`#`字符,但在`re.VERBOSE`模式下用作**行内注释**的起始标记,用于在复杂正则中添加可读性注释。
---
^ 的两种核心用途
| 使用位置 |
含义 |
示例 |
模式最外层(如 ^abc) |
匹配字符串开头位置 |
^Hello 匹配 "Hello world",不匹配 "Say Hello" |
字符类内部(如 [^0-9]) |
对字符集合取反 |
[^a-z] 匹配任意非小写字母字符 |
1 2 3 4 5 6 7 8
| import re
print(re.match(r'^Hello', 'Hello world')) print(re.match(r'^Hello', 'Say Hello'))
print(re.findall(r'[^0-9]', 'a1b2c3'))
|
### 锚定与 ^` 的成对使用
^ 和 $ 通常成对出现,用于精确匹配整个字符串或行:
1 2 3 4 5 6 7
| print(re.fullmatch(r'^\d+$', '123')) print(re.fullmatch(r'^\d+$', '123a'))
text = "apple\nbanana\ncherry" print(re.findall(r'^b\w+', text, re.MULTILINE))
|
# 在正则中的特殊行为
普通模式(默认)
# 仅作为普通字面量字符匹配自身。
1
| print(re.findall(r'#\d+', '编号 #001, #002'))
|
re.VERBOSE 模式(忽略空白和注释)
启用 re.VERBOSE 后,# 及其后的行内内容被忽略,可用于为复杂正则添加注释,提升可读性。
1 2 3 4 5 6 7 8 9
| pattern = re.compile(r''' ^ # 匹配行首 \d{3} # 匹配三位数字 [-\s]? # 可选分隔符(- 或空格) \d{4} # 匹配四位数字 $ # 匹配行尾 ''', re.VERBOSE)
print(pattern.match('123-4567'))
|
^ 与 \A、### 与 \Z` 的区别(拓展)
| 锚定符 |
匹配位置 |
是否受 re.MULTILINE 影响 |
^ |
字符串开头 / 每行开头 |
✅ 是(多行模式下匹配行首) |
\A |
字符串绝对开头(不受多行影响) |
❌ 否 |
$ |
字符串末尾 / 每行末尾 |
✅ 是(多行模式下匹配行尾) |
\Z |
字符串绝对末尾(不受多行影响) |
❌ 否 |
1 2 3
| text = "apple\nbanana" print(re.findall(r'^\w+', text, re.MULTILINE)) print(re.findall(r'\A\w+', text, re.MULTILINE))
|