Linux/Python学习论坛-京峰教育

 找回密码
 立即注册

一键登录:

搜索
热搜: 活动 交友 discuz
查看: 1001|回复: 2

版主学习笔记之正则表达式

[复制链接]

208

主题

269

帖子

1936

积分

超级版主

Rank: 8Rank: 8

积分
1936
发表于 2015-3-30 11:46:38 | 显示全部楼层 |阅读模式
1、"." 符号
点符号用于区配除换行符之外的任意一个字符。例如:r.t可以匹配rot、rtu、但不能匹配root,若使用r..t就可以匹配root、r/ft等。下面的例子是从/etc/passwd中查找出包含r,紧跟着两个任意字符,再接一个t"的行。
[root@mail ~]# grep 'r..t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

2、"*" 符号
星符号在正则表达式中用于匹配前一个字符0次或任意多次(与通配符中*有区别的哟),比如r*t,可以匹配t,rot,root,roooot等,"*"号经常和"."号一起使用,比如:".*"代表任意长度的不包含换行的字符,例如:下面的例子是试图找到连续的r字母紧跟着字母t的行。由于在/etc/passwd中没有rt、rrt这样的匹配,所以该表达示只能找出包含t的行(r匹配0次)。
[root@mail ~]# grep 'r*t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
cacti:x:496:496::/home/cacti:/sbin/nologin

如把上面的'r*t'换成'r.*t',代表查找包含字母r,后面紧跟任意长度的字符,再跟一人字母t的行。如:
root:x:0:0:root:/root:/bin/bash
postfix:x:2525:2525::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

3、"\{n,m\}" 符号
虽然"*"可以用于重复匹配前一个字符,但却不能精确地控制匹配的重复次数,使用"\{n,m\}"符号则能更加灵活的控制字符重复次数,典型的有以下3种形形式;
3.1、\{n\}  匹配前面的字符n次,下列匹配的是包含root的行(r和t中包含两个o)。
[root@mail ~]# grep 'ro\{2\}t' /etc/passwd
root:x:0:0:root:/root:/bin/bash

3.2、\{n,\} 匹配前面的字符至少n次以上(含n次)。
[root@mail ~]# grep 'ro\{0,\}t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin

3.3、\{n,m\ 匹配前面的字符n到m次。
例:查找匹配前面字符o出现1次或2次。只匹配到root用户。
[root@mail ~]# grep 'ro\{1,2\}t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
例:查找匹配前面字符o出现3次或4次,rooot为新建的一个用户。
[root@mail ~]# grep 'ro\{3,4\}t' /etc/passwd
rooot:x:10006:10010::/home/rooot:/bin/bash

4、"^" 符号
又称尖角号,这个符号用于匹配开头的字符,比如说"^mail"匹配的是以字母mail开头的所有行。
[root@mail ~]# grep '^mail' /etc/passwd

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin

5、"$" 符号
和上面的尖角号正好相反,"$"用于匹配尾部,比如说"bash$"代表以bash结尾的行,如果是"^$"则代表该行为空,因为^和$间什么都没有。下例匹配以l开头,中间有一串任意字符,以h结尾的行。
[root@mail ~]# grep '^l.*h$' /etc/passwd
lucy:x:10006:10010::/home/lucy:/bin/bash

6、"[]" 符号
方括号用于匹配方括号内出现的任一字符。比如说单项选择题的答案,有可能是A、B、C、D选项中任选一种,用正则表达式表示就是[ABCD]。如果匹配比较大范围,比如匹配任意一个大写字母,可以写成[A-Z],使用"-"号做范围限定,要匹配所有字母可以写成[A-Za-z]。这里"-"的作用不能充当一个字符。
   如果是要匹配不是大写字母A、B、C、D的字符可以使用上面学的"^"号,"^"号出现在"[]"中,则代表取反的意思,如[^A-D]。
例如匹配手机号,手机号是11位连续的数字,第一位一定是1,所以表示为"^1";第二位可能是3(移动)或8(联通),表示为"[38]";后面连续9个任意数字,用上面学习到的\{n\}知识,可以表示为"[0-9]\{9\}";表达式连起来应写为:"^1[38][0-9]\{9\}"。

7、"\" 符号
反斜线在Bash中为转义字符,用于除去一个单个字符的特殊意义,让它只代表字符本身,除了换行符,如果在反斜线之后立即出现一个换行字符,转义字符使行得以继续。
例如:上面学到的".*"代表的是任意长度的不包含换行的重复字符,但要匹配任意长度的点号怎么办呢,这时使用转义字符就行了"\.*"。如果要对"\"符号进行转义,就写为:"\\"。

8、"\<" 符号和 "\>" 符号
这两个符号分别用于界定单词的左边界和右边界,比如说"\<good" 用于匹配以"good"开头的单词;而"good\>"则用于匹配以"good"结尾的单词,两个符号还可以组合"<\>\"用于精确匹配一个字符串,所以"<\good>\"可以精确匹配单词good,而不是goood等(开头和结尾不是指整句话的开头和结尾,只是一个单词的开头和结尾)。如下所示:
[root@mail ~]# cat test.txt
goodmorning
verymorninggood
good morning

例1:查找匹配以good开头的单词。
[root@mail ~]# grep '\<good' test.txt
goodmorning
good morning

例2:查找匹配以good结尾的单词。
verymorninggood
good morning

例3:查找精确匹配good单词。
[root@mail ~]# grep '\<good\>' test.txt
good morning

9、"\d" 符号
匹配一个数字,等价于[0-9],但使用grep匹配这种正则表达式时可能会遇到无法匹配的问题,使用"\d"时需要加上-P参数。如下所示:
例1:13534567890是一个电话号码,用[0-9]匹配成功。
[root@mail ~]# echo 13534567890 | grep [0-9]
13534567890

例2:13534567890是一个电话号码,用'\d'匹配不成功,加上-P参数后匹配成功。
[root@mail ~]# echo 13534567890 | grep '\d'
[root@mail ~]#

#因为"\d"是一种Perl兼容模式的表达式,又称作PCRE,想要使用这种模式的匹配符,需要加上-P参数。

[root@mail ~]# echo 13534567890 | grep -P '\d'
13534567890

10、"\b" 符号
匹配单词的边界,比如"\bhello\b" 可精确的匹配"hello"单词,感觉给上面学到的\<\>差不多,如下如示:
[root@mail ~]# echo "hello world" | grep '\bhello\b'
hello world

[root@mail ~]# echo "helloworld" | grep '\bhello\b'
[root@mail ~]#

11、"B" 符号
匹配非单词的连界,比如hello\B可以匹配"helloworld"中的"hello"。
[root@mail ~]# echo "helloworld" | grep 'hello\B'
helloworld

12、"\w" 符号
匹配字母、数字和下划线,等价于[A-Za-z0-9]。
例1:匹配小写字母a,大写字母A,数字0。
[root@mail ~]# echo "aA0" | grep '\w'
aA0

例2:匹配不是数字、字母、下划线等,将无法匹配。
[root@mail ~]# echo "\\" | grep '\w'
[root@mail ~]#

13、“\W” 符号
匹配非字母、非数字、非下划线,等价于[^A-Za-z0-9]。
例1:匹配非字母、非数字、非下划线成功
[root@mail ~]# echo "\\" | grep '\W'
\

例2:无法匹配大小写字母、数字。
[root@mail ~]# echo "aA0" | grep '\W'
[root@mail ~]#

后面几个可以了解下,有需要的童鞋可以研究下。

14、“\n” 符号
匹配一个换行符

15、“\r” 符号
匹配一个回车符

16、“\t” 符号
匹配一个制表符

17、“\f” 符号
匹配一个换页符

18、“\s” 符号
匹配任何空白字符

19、“\S” 符号
匹配任何非空白字符

无基础的同学可以跟着我学,有什么问题可以提出,大家共同学习进步,大神请绕道,不要拍砖。哈哈哈哈。








回复

使用道具 举报

0

主题

25

帖子

301

积分

中级会员

Rank: 3Rank: 3

积分
301
发表于 2015-3-31 09:06:56 | 显示全部楼层
学习了,适合我们这种零基础的。
回复 支持 反对

使用道具 举报

208

主题

269

帖子

1936

积分

超级版主

Rank: 8Rank: 8

积分
1936
 楼主| 发表于 2015-3-31 11:55:59 | 显示全部楼层
Rootman 发表于 2015-3-31 09:06
学习了,适合我们这种零基础的。

我也在当0基础的学。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|京峰教育,只为有梦想的人 ( 京ICP备15013173号 )

GMT+8, 2019-5-23 03:33 , Processed in 0.024524 second(s), 10 queries , Redis On.

快速回复 返回顶部 返回列表