正则是什么
正则表达式是一种字符串模式,用来对某些规则的文本内容进行处理。利用字符串构成成的数据结构,来完成对文本内容的匹配。
经常可以看到正则表达式的句子里包含了一些\d、\w和()之类的符号,这些特殊格式的符号可以看做正则结构中的元素,这些符号也成之为元字符,下面介绍下这些元字符的作用。
常用元字符
下面列出正则中常用元字符及表示意思,这些通用元字符的使用在不同语言中表达作用是相同的。
- 匹配字符内容
符号 | 代表意思 | 使用场景 |
---|---|---|
\d | 数字0-9 | \d 匹配单个数字,1、2、3 |
\D | 非数字 | \D 匹配单个非数字,a、-、' |
\w | 字母、数字、下划线 | \w 匹配单个字母、数字、下划线,a、1、_ |
\W | 非字母、数字、下划线 | \W 匹配单个非字母、数字、下划线,{、-、[ |
\s | 空白字符 | \s 匹配单个空格、回车(\n)、制表符(\t) |
\S | 非空白字符 | \S 匹配单个非空格、换行(\n)、制表符(\t) |
. | 匹配除换行之外的所有字符 | . 单个换行之外所有字符 |
以上表格中元字符为常用通配字符,使用形式如:
\d\d\d --------- 123
\w\w\w\w\w\s\w\w\w\w\w --------- hello world
但是上述写法存在一个很明显的缺陷,就是\d、\w的重复次数问题。所以下面列举表达次数的元字符
- 匹配次数
符号 | 代表意思 | 使用场景 |
---|---|---|
* | 0次及0次以上 | \d* 匹配数字,123、02、空 |
+ | 1次及1次以上 | \d+ 匹配数字,123、02、3 |
? | 0次或1次 | \d? 匹配数字,2、空 |
{m,n} | m次到n次 | \d{1,3} 匹配数字,2、12、123 |
{n} | n次 | \d{2} 匹配数字,12 |
{n,} | n次及n次以上 | \d{2,} 匹配数字,12、123、1234 |
有了表达次数的元字符后,上述形式的字符串模板写法就简单些了
\d{3} --------- 123
\w{5}\s{5} --------- hello world
但是只有通配符号、和次数的元字符还不足以应对常用场景:
String line = "hello world!"
这里如果要匹配整个字符串内容,或者只匹配hello这一个单词,也就是需要对字符串的位置进行校验,下面列出匹配位置的元字符
- 分组符号
在继续之前,首先介绍下"()",这里的小括号"()",称之为分组,分组匹配的内容可以在后续的正则中重复使用,只需要指定分组的序号即可。分组的序号是从左往右以此递增的
示例:
^(\w{4})\s\1\b --------- long long ago --- > 匹配"long long"
分组的作用,除了提供后续引用之外,也用作捕获组,即正则中分组对应的匹配内容
示例:
import re
reg = "(\w{2})(\w{3})"
print(re.match(reg,"hello").groups())
输出结果:
('he', 'llo')
he
llo
由例子中可以看出这里的()分组捕获的匹配内容
有捕获分组,自然也有非捕获分组,在分组开头添加?:,表示该分组对应内容为非捕获分组
示例:
import re
reg = "(?:\w{2})(\w{3})"
print(re.match(reg,"hello").groups())
print(re.match(reg,"hello").group(1))
输出结果:
('llo',)
llo
其中分组的序号由"("出现的顺序确定,第一个"("序号为1,从左往右递增
示例:
import re
reg = "((?:\w{2})(\w{3}))"
print(re.match(reg,"hello").groups())
print(re.match(reg,"hello").group(1))
print(re.match(reg,"hello").group(2))
输出结果:
('hello', 'llo')
hello
llo
- 匹配位置
符号 | 代表意思 | 使用场景 |
---|---|---|
^ | 字符串开始位置 | (^)abc 匹配字符串开头位置,a前面的位置 |
$ | 字符串结束位置 | abc($) 匹配字符串结束位置,c后面的位置 |
\b | 单词(\w)与非单词之间的位置 | a(\b)= 匹配"a"与"="之间的位置 |
\B | 字符与字符之间的位置 | a(\B)b 匹配"a"与"b"之间的位置 |
这里的元字符只是匹配位置,通过使用位置元字符来限制、过滤指定位置条件的内容。
^(\w{5})\b ----- hello world -> 匹配内容为: hello
这里的匹配过程是:
- ^指定字符串开头位置
- \w{5}匹配内容
- \b用来匹配"o"于空格之间的位置
- 其他元字符
符号 | 代表意思 | 使用场景 |
---|---|---|
[] | 匹配范围 | [a-zA-Z] 匹配单个英文字母 |
^ | 在上面的匹配位置元字符中,仅仅介绍了匹配字符串开头位置的作用,这里另外一个作用就是放在范围元字符中,起到取反的作用 | [^a-d] 匹配单个非a,b,c,d四个英文字母之外的字符 |
\ | 转义元字符 | 1\+ 匹配"1+" |
| | 分支条件 | ab|cd 匹配ab、cd |
关于断言、懒惰匹配相关内容在下一章介绍正则表达式(二):断言