出现在正则表达式字符串中,有两种字符:

  • 一种叫普通字符,
    写在正则表达式里面的普通字符都是表示: 直接匹配它们。

  • 有些特殊的字符,术语叫 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编辑器)

  • 例如\.就是用来匹配.

接下篇

python正则re学习记录(之二)

最后修改:2020 年 04 月 19 日
如果觉得我的文章对你有用,请随意赞赏