【Python】正则表达式中的`^`和`[]`
一、正则表达式:符号^
^
在正则表达式中有两种常见的含义,具体取决于它的位置:
1. 在字符集 [ ] 的开头时,表示取反(negation)。
例如:
[^s]
:匹配任何非空白字符。[^a-z]
:匹配任何不在 a-z 范围内的字符。
2. 在字符集之外时,表示字符串的开始(anchor)。
例如:
^https
:匹配以 “https” 开头的字符串。^\d
:匹配以数字开头的字符串。
总结:
- 在 [ ] 内:取反。
- 在 [ ] 外:字符串开始。
需要根据上下文判断 ^ 的具体含义。
二、正则表达式:字符集[ ]
[ ]
在正则表达式中表示字符集(character set),用于匹配其中任意一个字符。下面详细讲解其具体用法和规则:
1. 基本用法
字符集 [ ]
中的每个字符都是独立的匹配选项。例如:
[abc]
:匹配a
、b
或c
中的任意一个字符。[0123456789]
:匹配任意一个数字(等价于[0-9]
)。
示例:
import re
text = "a1b2c3"
print(re.findall(r'[abc]', text)) # 输出: ['a', 'b', 'c']
print(re.findall(r'[0-9]', text)) # 输出: ['1', '2', '3']
2. 取反(Negation)
如果 ^
出现在字符集的开头(即 [^...]
),表示匹配不在该字符集中的任意字符。例如:
[^abc]
:匹配除了a
、b
、c
之外的任意字符。[^0-9]
:匹配非数字字符(等价于\D
)。
示例:
text = "a1b2c3!@#"
print(re.findall(r'[^abc]', text)) # 输出: ['1', '2', '3', '!', '@', '#']
print(re.findall(r'[^0-9]', text)) # 输出: ['a', 'b', 'c', '!', '@', '#']
3. 范围(Range)
在字符集中,可以用 -
表示字符范围(需确保 -
不在开头或结尾,否则会被视为普通字符)。例如:
[a-z]
:匹配任意小写字母。[A-Z]
:匹配任意大写字母。[0-9]
:匹配任意数字(等价于\d
)。
示例:
text = "Hello World 123"
print(re.findall(r'[a-z]', text)) # 输出: ['e', 'l', 'l', 'o', 'o', 'r', 'l', 'd']
print(re.findall(r'[A-Z]', text)) # 输出: ['H', 'W']
print(re.findall(r'[0-9]', text)) # 输出: ['1', '2', '3']
4. 特殊字符在字符集中的处理
- 普通元字符(如
*
、+
、?
)在字符集中会被视为普通字符,无需转义。例如:[*+]
:匹配*
或+
。
- 如果需要匹配
-
或]
,需注意:-
放在开头或结尾(如[a-]
或[-a]
)。]
放在开头(如[]a]
)或转义(如[\]]
)。
示例:
text = "a*b+c?d]"
print(re.findall(r'[*+?]', text)) # 输出: ['*', '+', '?']
print(re.findall(r'[]]', text)) # 输出: [']']
5. 与预定义字符类的关系
字符集 [ ]
可以实现类似预定义字符类(如 \d
、\w
、\s
)的功能,但更灵活:
\d
≈[0-9]
(数字)。\w
≈[a-zA-Z0-9_]
(单词字符)。\s
≈[\t\n\r\f\v]
(空白字符)。
示例:
text = "abc123 _!@#"
print(re.findall(r'\w', text)) # 输出: ['a', 'b', 'c', '1', '2', '3', '_']
print(re.findall(r'[a-zA-Z0-9_]', text)) # 效果相同
6. 与锚点 ^
的区别
^
在字符集外表示字符串开头(如^abc
匹配以abc
开头的字符串)。^
在字符集内表示取反(如[^abc]
匹配非a
、b
、c
的字符)。
示例:
text = "abc123 xyz"
print(re.findall(r'^abc', text)) # 输出: ['abc'](匹配开头)
print(re.findall(r'[^abc]', text)) # 输出: ['1', '2', '3', ' ', 'x', 'y', 'z'](取反)
总结
[ ]
:字符集,匹配其中任意一个字符。[^...]
:取反字符集,匹配不在其中的字符。-
:在字符集中表示范围(如[a-z]
)。- 注意与锚点
^
的区别,以及特殊字符的处理。