开发者学堂课程【Python 入门 2020年版:标点符号的特殊含义】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/639/detail/10447
标点符号的特殊含义
内容介绍:
一、非打印字符
二、特殊字符
一、非打印字符
非打印字符也可以是正则表达式的组成部分。
下面列出了表示非打印字符的转义序列:
\cx:匹配由 x 指明的控制字符。例如, lcM 匹配一个 Control-M 或回车符。
x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的'c'字符。
\f:匹配一个换页符。等价于\x0c 和\cL。
\n:匹配一个换行符。等价于\x0a 和\cJ。
\r:匹配一个回车符。等价于\x0d 和\cM。
\s:匹配任何空白字符,包括空格、制表符、换页符等等。等价于[\f\n\r\f\v]。注意 Unicode 正则表达式会匹配全角空格符。
\S:匹配任何非空白字符。等价于[\f\n\r\t\v]。
\t:匹配一个制表符。等价于\x09和\ cl。
\v:匹配一个垂直制表符。等价于\x0b 和\cK。
1. \s
\s 表示任意的空白字符,注意这是小写 s
import re
print(re.search(r'\s ', 'hello world '))
#空格
print(re.search(r'\n', 'hello\nworld ' ))
#换行
print(re.search(r'\t', "hello\tworld '))
#制表符
输出结果为:
<re.Match object; span=(5,6), match=' '>
<re.Match object; span=(5,6), match= ' \n '>
<re.Match object; span=(5,6), match=' \t '>
匹配的都是空白字符。
2. \S
\S 表示非空白字符,注意这个是大写 S
print(re.search(r'\s' , '\t\n x'))
输出的结果为:
<re.Match object; span=(5,6), match='x '>
匹配的都是非空白字符,空格什么的都不会匹配。
其他的我们就不再说了。
二、特殊字符
所谓特殊字符,就是一些有特殊含义的字符。若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符\放在它们前面。下表列出了正则表达式中的特殊字符:
():标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用\(和\ )。
. :匹配除换行符\ n 之外的任何单字符。要匹配.,请使用\ .。
[ :标记一个中括号表达式的开始。要匹配[,请使用\[。
\ : 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如,'n'匹配字符'n'。'\n'匹配换行符,匹配\,而\(则匹配(。
{ :标记限定符表达式的开始。要匹配{,请使用\{。
| :指明两项之间的一个选择。要匹配|,请使用 V。
\d :匹配一个数字字符。等价于[0-9]。
[0-9] :匹配任何数字。等价于\d。
\D:匹配一个非数字字符。等价于一[^0-9]。
1. ()
用来表示一个分组。
m = re.search(r' h( \d+)x' , 'sh829xkflsa ' )
print(m.group(0))
输出的结果为:h829x
如果改为 m.group(1),运行结果就会变成:829。
如果我们就只想拿到后面小括号的内容:
m1 = re.search(r"(.*)',‘(1+1)*3+5')
print(m1.group())
输出的结果为:(1+1)*3+5拿到的是全部内容,如果想只拿(1+1)这个部分,应该改成 m1 = re.search(r"\(.*\)',‘(1+1)*3+5'),括号前面应该加一个反斜杠\。
此时的运行结果就是:(1+1)。
如果要表示括号一定要加反斜杠:
m = re.search(r" h( ld+)x', 'sh829xkflsa ' )
<re.Match object; span=(1,6),match='h829x '>
这个时候这个‘h’是拿不到的,要想拿到必须要加一个括号。
m = re.search(r" (h)(ld+)x', 'sh829xkf1sa ' )
m.group(1)
这个时候输出就是 h
2. .
表示匹配除了换行以外的任意字符。如果想要匹配.,那就需要使用\.。
3. []
用来表示可选项。[×-y]从 x 到 y 区间,包含 x 和 y。
m2 = re.search(r'f[0-5]m', 'pdsf6m ' )
print(m2)
此时输出的结果为:None。
这个表示的是 f 到 m 之前大小再0~5之间的数字,所以输出为空,假如把6改成3,就会输出:
<re.Match object; span=(3,6), match='f3m'>
注意这里面的0~5是包括开始和结束的,即包括0和5。
而且包括字字母也可以:
m2 = re.search(r'f[a-d]m', 'pdsfcm ' )
print(m2)
输出的结果为:
<re.Match object; span=(3,6), match='fcm'>
假如我们把 f 和 m 之间的数字变成4423,会发现输出为空,是因为只能匹配一次,如果想匹配需要加一个”+”,改为
m2 = re.search(r'f[0-5]+m', 'pdsf4423m ' )
print(m2)
此时输出的结果就是:
<re.Match object; span=(3,9), match='f4423m'>
m2 = re.search(r'f[0-5a-dx]+m', 'pdsfxm ' )
print(m2)
输出的结果为:
<re.Match object; span=(3,9), match='fxm'>
这里表示的是再 f 和 m 这个区间中可以匹配0到5或者 a 到 d 或者 x 都可以匹配成功,但是只能出现一次。
4. |
用来表示或者。和[]有一定的相似,但是有区别。[]表示的是区间,|表示的是可选值。
m2 = re.search(r'f(x|prz|t)m', 'pdsfprzm ' )
print(m2)
输出的结果为:
<re.Match object; span=(3,8), match='fprzm'>
其中可以出现 x 或者 prz 或者 t,出现其他的字母就会匹配不成功。
re.search(r'f(×|[prz]|t)m', 'pdsfzm' )
<re.Match object; span=(3,6), match='fzm ' >
这个证明[]之中只能出现单个字符,而|匹配的是 prz 这个字符串,[]只能匹配 prz 中其中的一个字符。
5. {}
用来限定大括号前面的元素出现的次数。
{n}:表示前面的元素出现 n 次
{n,}:表示前面的元素出现 n 次以上。
{,n}:表示前面的元素出现 n 次以下。
{m,n}:表示前面的元素初选 m 到 n 次
print(re.search(r'go{2}d', 'good' ))
输出的结果为:
re.Match object; span=(0,4), match='good' >
这里表示 o 出现2次。如果 good 变成 god 就会匹配不成功输出
None
print(re.search(r'go{2,}d', 'gooooood' ))
输出的结果为:
re.Match object; span=(0,8), match='gooooood' >
print(re.search(r'go{,2}d', 'gd' ))
输出的结果为:
re.Match object; span=(0,2), match='gd' >
print(re.search(r'go{3,5}d', 'gooood' ))
输出的结果为:
re.Match object; span=(0,6), match='gooood' >
6. *
表示前面的元素出现任意次数(0次及以上)等价于{0,}
print(re.search(r'go*d', 'gooooood' ))
输出的结果为:
re.Match object; span=(0,8), match='gooooood' >
如果中间o过多输出的时候会显示全。
7. +
表示前面的元素至少出现一次,等价于{1,}
print(re.search(r'go+d', 'goood' ))
输出的结果为:
re.Match object; span=(0,5), match='goood' >
8. ?
两种方法:
1. 规定前面的元素最多只能出现一次,等价于{,1}。
2. 将贪婪模式转换成为非贪婪模式。
print(re.search(r'go?d', 'god ' ))
输出的结果为:
re.Match object; span=(0,3), match='good' >
9. ^和&
^:以指定的内容开头
$:指定内容结尾
print(re.search(r'^a.*i$" , 'xmp\naofi\nddpppq ', re.M))
输出的结果为:
re.Match object; span=(4,8), match='aofi' >
以 a 开头以 i 结尾。
空格不会被检测到,只有换行才能够匹配成功。记得要加 re.M。