出现在正则表达式字符串中,有两种字符:
-
一种叫普通字符,
写在正则表达式里面的普通字符都是表示: 直接匹配它们。 -
有些特殊的字符,术语叫 metacharacters(元字符)
这些特殊的元字符包括下面这些:
. * + ? \ [ ] ^ $ { } | ( )
下面将一一介绍:
. 匹配所有字符
.
匹配除了换行符
之外的所有单个字符
*
重复匹配任意次
*
表示匹配前面的子表达式任意次,包括0次。
*`.`** 在正则表达式中非常常见,表示匹配任意字符任意次数。
例如:,.*
中,匹配包括,
的所有字符,*若,
后面没有字符,`.匹配0次,即则只匹配
,`**
+
重复匹配多次
+
表示匹配前面的子表达式一次或多次,不包括0次。
例如:,.+
中,匹配包括,
的所有字符,若,
后面没有字符,.+
至少匹配1次,即无匹配
?
匹配0-1次
?
表示匹配前面的子表达式0次或1次。
例如:,.?
中,匹配包括,
的后任意一位,若,
后面没有字符,.?
匹配0次,即则只匹配,
{}
匹配指定次数
{3}
表示前面的字符匹配3次。
{3,4}
表示前面的字符匹配 至少3次,至多 4 次。
贪婪模式和非贪婪模式
例如我们想匹配abcdfcd
中的abc
时
如果用a.*c
import re
content = 'abcdfcd'
pattern = re.compile('a.*c')
result = re.search(pattern, content)
print(result.group())
但运行结果时abcdfc
,为什么呢?
原来 在正则表达式中,*
, +
, ?
都是贪婪地,使用他们时,会尽可能多的匹配内容
所以a.*c
一直匹配到了dfcd
中的f
解决这个问题,就需要使用非贪婪模式,也就是在*
后面加上 ?
,变成这样 a.*?c
import re
content = 'abcdfcd'
pattern = re.compile('a.*?c')
result = re.search(pattern, content)
print(result.group())
运行结果:abc
这就对了。
\
对元字符的转义
例如我们在匹配中需要匹配. * + ? \ [ ] ^ $ { } | ( )
这些,就需要用反斜杠
来转义
(其实很多语言都是用\
来转义的,比如我现在用的markdown编辑器)
- 例如
\.
就是用来匹配.
的