正则表达式
正则表达式简述
正则表表达式,又称规则表达式
正则表达式是特殊的字符序列,利用事先定义好的特定字符以及他们的组合组成了一个规则,然后检查一个字符串是否与这种规则匹配来实现对字符的过滤或匹配。正则表达式是字符串处理的有力工具,但是并不是Python独有的,其他语言也有。在Python中,re模块提供了正则表达式操作所需要的功能
正则表达式的分类
正则表达式:REGEXP,REGular EXPression。
正则表达式分为两类:
- Basic REGEXP(基本正则表达式)
- Extended REGEXP(扩展正则表达式)
基本正则表达式
元字符
. //任意单个字符
[root@master a]# ls
1 2 3 4 5 6 7 8 9 a z Z
[root@master a]# ls |grep '.'
1
2
3
4
5
6
7
8
9
a
z
Z
[] //匹配指定范围内的任意单个字符
[root@master a]# ls
1 2 3 4 5 6 7 8 9 a z Z
[root@master a]# ls |grep '[1-9]'
1
2
3
4
5
6
7
8
9
[^] //匹配指定范围外的任意单个字符
[root@master a]# ls
1 2 3 4 5 6 7 8 9 a z Z
[root@master a]# ls |grep '[^1-9]'
a
z
Z
匹配次数(贪婪模式)
* //匹配其前面的任意单个字符任意次
[root@master b]# ls
a aa aaa aab abb abbb baa bba
[root@master b]# ls |grep '^ab*$' //表示一个字符串有一个a后面跟着零个或若干个b
a
abb
abbb
.* //任意长度的任意字符
[root@master b]# ls
a aa aaa aab abb abbb baa bba
[root@master b]# ls |grep '.*'
a
aa
aaa
aab
abb
abbb
baa
bba
\? //匹配其前面的任意单个字符1次或0次
[root@master b]# ls
a aa aaa aab ab abb bbb
[root@master b]# ls |grep '^ab\?$' //表示一个字符串有一个a后面跟着零个或者一个b
a
ab
\+ //匹配其前面的任意单个字符至少1次
[root@master b]# ls
a aa aaa aab ab abb bbb
[root@master b]# ls |grep '^ab\+$' //表示一个字符串有一个a后面跟着至少一个b或者更多
ab
abb
\{m,n\} //匹配其前面的任意单个字符至少m次,至多n次
[root@master b]# ls
a aa aaa aab ab abb bbb
[root@master b]# ls |grep '^ab\{2\}$' //表示一个字符串有一个a跟着2个b
abb
[root@master b]# ls
a aa aaa aab ab abb abbb abbbb abbbbbb bbb
[root@master b]# ls |grep '^ab\{2,\}$' //表示一个字符串有一个a跟着至少2个b
abb
abbb
abbbb
abbbbbb
[root@master b]# ls |grep '^ab\{3,5\}$' //表示一个字符串有一个a跟着3到5个b
abbb
abbbb
//位置锚定
^ //锚定行首,此字符后面的任意单个字符必须出现在行首
$ //锚定行尾,此字符前面的任意单个字符必须出现在行尾
[root@master b]# ls
a aa aaa aab ab abb abbb abbbb abbbbbb abc bbb
[root@master b]# ls |grep '^b'
bbb
[root@master b]# ls |grep 'c$'
abc
^$ //空白行
[root@master ~]# cat c
hello world
hehe
[root@master ~]# grep ^$ c
[root@master ~]# grep -v ^$ c
hello world
hehe
\v或\b //锚定词首,其后面的任意单个字符必须作为单词首部出现
[root@master ~]# cat hello
hello aaa bbb ccc dddd
ad ad ad aadddjljlj
[root@master ~]# grep '\<h' hello
hello aaa bbb ccc dddd
[root@master ~]# grep 'd\>' hello
hello aaa bbb ccc dddd
ad ad ad aadddjljlj
[root@master ~]# cat hello
hello aa hello bb hello cc
/分组
\(\)
例:\(ab\)*
//后向引用
\1 //引用第一个左括号以及与之对应的右括号所包括的所有内容
\2 //引用第二个左括号以及与之对应的右括号所包括的所有内容
hello runtime world
[root@master ~]# sed 's/hello \(.*\) \(.*\)/hello \2 \1/' hello
hello cc aa hello bb hello
hello world runtime
扩展正则表达式
字符匹配
. //任意单个字符
[root@master a]# ls
1 2 3 4 5 6 7 8 9 a z Z
[root@master a]# ls |egrep '.'
1
2
3
4
5
6
7
8
9
a
z
Z
[] //匹配指定范围内的任意单个字符
[root@master a]# ls
1 2 3 4 5 6 7 8 9 a z Z
[root@master a]# ls |egrep '[1-9]'
1
2
3
4
5
6
7
8
9
[^] //匹配指定范围外的任意单个字符
[root@master a]# ls
1 2 3 4 5 6 7 8 9 a z Z
[root@master a]# ls |grep '[^1-9]'
a
z
Z
匹配次数(贪婪模式)
* //匹配其前面的任意单个字符任意次
[root@master b]# ls
a aa aaa aab abb abbb baa bba
[root@master b]# ls |egrep '^ab*$' //表示一个字符串有一个a后面跟着零个或若干个b
a
abb
abbb
.* //任意长度的任意字符
[root@master b]# ls
a aa aaa aab abb abbb baa bba
[root@master b]# ls |egrep '.*'
a
aa
aaa
aab
abb
abbb
baa
bba
\? //匹配其前面的任意单个字符1次或0次
[root@master b]# ls
a aa aaa aab ab abb bbb
[root@master b]# ls |egrep '^ab\?$' //表示一个字符串有一个a后面跟着零个或者一个b
a
ab
\+ //匹配其前面的任意单个字符至少1次
[root@master b]# ls
a aa aaa aab ab abb bbb
[root@master b]# ls |egrep '^ab\+$' //表示一个字符串有一个a后面跟着至少一个b或者更多
ab
abb
\{m,n\} //匹配其前面的任意单个字符至少m次,至多n次
[root@master b]# ls
a aa aaa aab ab abb bbb
[root@master b]# ls |egrep '^ab\{2\}$' //表示一个字符串有一个a跟着2个b
abb
[root@master b]# ls
a aa aaa aab ab abb abbb abbbb abbbbbb bbb
[root@master b]# ls |egrep '^ab\{2,\}$' //表示一个字符串有一个a跟着至少2个b
abb
abbb
abbbb
abbbbbb
[root@master b]# ls |egrep '^ab\{3,5\}$' //表示一个字符串有一个a跟着3到5个b
abbb
abbbb
//位置锚定
^ //锚定行首,此字符后面的任意单个字符必须出现在行首
$ //锚定行尾,此字符前面的任意单个字符必须出现在行尾
[root@master b]# ls
a aa aaa aab ab abb abbb abbbb abbbbbb abc bbb
[root@master b]# ls |egrep '^b'
bbb
[root@master b]# ls |egrep 'c$'
abc
^$ //空白行
[root@master ~]# cat c
hello world
hehe
[root@master ~]# egrep ^$ c
[root@master ~]# egrep -v ^$ c
hello world
hehe
\v或\b //锚定词首,其后面的任意单个字符必须作为单词首部出现
[root@master ~]# cat hello
hello aaa bbb ccc dddd
ad ad ad aadddjljlj
[root@master ~]# egrep '\<h' hello
hello aaa bbb ccc dddd
[root@master ~]# egrep 'd\>' hello
hello aaa bbb ccc dddd
ad ad ad aadddjljlj
[root@master ~]# cat hello
hello aa hello bb hello cc
//分组
() //分组
\1,\2,\3,....
例:(ab)*
//后向引用
\1 //引用第一个左括号以及与之对应的右括号所包括的所有内容
\2 //引用第二个左括号以及与之对应的右括号所包括的所有内容
[root@master ~]# cat hello
hello aa hello bb hello cc
hello runtime world
[root@master ~]# sed -r 's/(hello) (.*) (.*)/\3 \1 \2/' hello
cc hello aa hello bb hello
world hello runtime