模式(pattern),模式是正则表达式最重要的概念之一,模式可以理解为模版,设计好了模板之后可以利用此模板与未知字符串进行匹配,得到自己想要的结果。比如设计一个电话号码的模式(pattern),就可以匹配一大串文字中的电话号码。
元字符通俗地理解就是:并不代表本身字符的含义,而是被赋予了特殊含义的字符。
例如
.
,在模式里面被用来匹配任意一个字符,与其本身的’点’的含义相去甚远。又比如
?
,在模式里面表示前面字符(组)出现的次数为0或1次。
换言之,被占用的无法表征本身含义的字符称之为元字符。元字符包含以下内容:
. ^ $ * + ? { } [ ] \ | ( )
字符 | 含义 | 举例 |
---|---|---|
. |
任意字符 | |
^ |
匹配开头 | |
$ |
匹配结尾 | |
* |
匹配0次或多次 | |
+ |
匹配1次或多次 | |
? |
匹配0次或1次 | |
{} |
指定匹配重复次数 | {m,n} 至少重复 m 次,至多重复 n 次。m 和 n 不是必填的,缺失的情况下会设定为默认值。缺失 m 会解释为最少重复 0 次 ,缺失 n 则解释为最多重复无限次。 |
[] |
匹配括号中的任意一个字符 | [abc] 表示a或b或c中的任意一个。匹配正负号:[+-]? 可以使用-连接多个字符,以简化书写, [a-z] 、[a-zA-Z] |
\ |
转义 | |
() |
组 | 类似于改变优先级 |
元字符^和$在正则表达式中具有特殊的含义,它们可以用来匹配输入字符串的开头和结尾。
^:匹配输入字符串的开头。
例子1:^abc匹配任何以"abc"开头的字符串,例如"abcdef"、"abc123"等。
例子2:^a.b匹配任何以"a"后跟任何字符(除了换行符)再后跟"b"开头的字符串,例如"appleb"和"abab",但不匹配"ab"或"banana"。
$:匹配输入字符串的结尾。
例子1:def$匹配任何以"def"结尾的字符串,例如"abcdef"、"123def"等。
例子2:a.b$匹配任何以"a"后跟任何字符(除了换行符)再后跟"b"结尾的字符串,例如"appleb"和"abab",但不匹配"ab"或"banana"。
注意:在多行模式中,^和$的行为与它们在单行模式中的行为不同。
在多行模式中,^和$分别匹配每行的开头和结尾,而不是整个字符串的开头和结尾。
要启用多行模式,请使用re.MULTILINE标志。
答案是使用反斜杠\
?
,需要将模式写为\?
.
,需要将模式写为\.
\
,需要将模式写为\\
存在的问题,多个反斜杠给阅读带来了巨大的障碍,如果需要需要匹配的结果存在的多个斜杠,那么就需要双倍的斜杠用于取消其元字符含义。
例如需要匹配\\
,模式写为\\\\
。
解决方案,使用原始字符前缀r
使用 Python 的原始字符串表示法来表示正则表达式;反斜杠不以任何特殊的方式处理前缀为 'r'
的字符串字面,因此 r"\n"
是一个包含 '\'
和 'n'
的双字符字符串,而 "\n"
是一个包含换行符的单字符字符串。 正则表达式通常使用这种原始字符串表示法用 Python 代码编写。
使用原始字符前缀r
简化后的模式:
?
,需要将模式写为r\?
.
,需要将模式写为r\.
\
,需要将模式写为r\
符号 | 说明 | 示例 |
---|---|---|
\d |
匹配数字,等价于[0-9] |
|
\w |
匹配任何字母数字下划线字符,等价于[a-zA-Z0-9_] |
|
\s |
匹配任何空白字符,等价于[ \t\n\r\f\v] |
方法 / 属性 | 目的 |
---|---|
match(pattern, string, flags=0) |
确定正则是否从字符串的开头匹配。 |
search(pattern, string, flags=0) |
扫描字符串,查找此正则匹配的任何位置。 |
findall(pattern, string, flags=0) |
找到正则匹配的所有子字符串,并将它们作为列表返回。 |
finditer(pattern, string, flags=0) |
找到正则匹配的所有子字符串,并将它们返回为一个 iterator。 |
函数参数说明:
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串。 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。 参见:[正则表达式修饰符 - 可选标志] |
输入参数flag
:
flag
参数是一个位掩码,可以使用以下标志之一或它们的组合:
re.IGNORECASE
:忽略大小写。
re.MULTILINE
:多行模式,使元字符的行为与多行文本匹配。
re.DOTALL
:使.元字符匹配任意字符,包括换行符。
re.VERBOSE
:启用注释和白空格,允许在正则表达式中包含注释。
如果没有找到匹配, match()
和 search()
返回 None
。如果它们成功, 一个 匹配对象 实例将被返回,包含匹配相关的信息:起始和终结位置、匹配的子串以及其它。
现在你可以检查 匹配对象 以获取有关匹配字符串的信息。 匹配对象实例也有几个方法和属性;最重要的是:
方法 / 属性 | 目的 |
---|---|
group() |
返回正则匹配的字符串 |
start() |
返回匹配的开始位置 |
end() |
返回匹配的结束位置 |
span() |
返回包含匹配 (start, end) 位置的元组 |
group()
返回正则匹配的子字符串。
start()
和 end()
返回匹配的起始和结束索引。
span()
在单个元组中返回开始和结束索引。 由于 match()
方法只检查正则是否在字符串的开头匹配,所以 start()
将始终为零。 但是,模式的 search()
方法会扫描字符串,因此在这种情况下匹配可能不会从零开始。
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 none。
re.match(pattern, string, flags=0)
text = "The quick brown fox jumps over the lazy dog."
pattern = r'\b\w+\b'
words = re.findall(pattern, text)
print(words)
\b 是一个正则表达式的元字符,表示单词的边界。它用于匹配一个单词的开始或结尾位置,而不会匹配一个完整单词。
详细解释如下:
\b 是一个特殊的元字符,用于指示正则表达式的单词边界。这意味着它会匹配一个单词与非单词字符之间的位置。
当使用 \b 时,正则表达式会查找一个单词的开头或结尾位置,而不是匹配整个单词。例如,如果使用正则表达式 \bcat\b 来匹配字符串 “catdog”,它将不会匹配到整个单词 “cat”,因为 \b 将阻止它匹配 “cat” 的后面部分 “dog”。
\b 可以用于匹配独立的单词,或者用于分隔不同的单词。例如,可以使用正则表达式 \bapple\b 来匹配独立的单词 “apple”,或者使用正则表达式 \b\w+\b 来匹配一个或多个字母数字字符组成的单词。
\b 只匹配单词的边界位置,而不匹配单词本身。如果想要匹配整个单词,可以使用其他元字符或正则表达式的组合来实现。
总之,\b 是一个用于指示正则表达式中的单词边界的元字符,它可以帮助我们更精确地匹配字符串中的单词。
正则表达式学习网站
4种可以利用的情况:
\d+(?=PM)
\d+(?!PM)
$
的数字:(?<=\$)\d+
$
的数字:(?!\$)\d+
Python默认是全局匹配,如果要修改为局部匹配,通过标志位
re.LOCALE
(缩写为re.L
)进行设置,多行匹配的标志位为re.MULTIPLINE
,可以缩写为re.M
,还有忽略大小写通过re.IGNORECASE
(缩写为re.I
)进行控制。但是python的标志位设置能力很有限,因为它的匹配方法有多个。
- re.match:从头开始匹配
- re.search:全局匹配,只返回第一个符合条件的输入,输出为Match对象,
- 使用group()方法可以获取得到内容
- 使用span可以获取得到匹配子串的范围
- 使用start可以获取匹配子串的起点
- 使用end可以获取匹配子串的终点
- re.findall:全局匹配,返回所有符合条件的输入,输出位列表形式
- re.finditer:全局匹配,为了避免申请大量内存的列表,返回值是一个迭代器。
贪婪匹配有点类似于全局匹配,在匹配到第一个满足条件的内容时,仍然不停止,一直要穷尽所有的样例
懒惰匹配则刚好相反,匹配到第一个满足条件的就停止匹配。