通配符和正则表达式

Published: 26 Dec 2015 Category: Linux
首先理解两者的区别

  • 通配符与正则表达式很容易混淆,首先要明白二者是不同的。正则表达式只是一种表示法,只有当工具支持这种表示法,才可以处理正则表达式的字符串。 其实,我们登录Linux之后,系统的bash shell并不支持正则表达式的,也就是说,我们如果使用bash shell的某些命令时使用正则表达式,shell可能会认不出来,只有当我们使用类似grep,sed,awk等工具的时候才有效。所以,我们在使用bash shell的时候也想达到模糊匹配的目的的话,就要使用通配符了。正则表达式多用于文本内容中的字符串搜索和替换,通配符多用于对文件的操作,如 rm *.txt

通配符

最常用的是*、?、[]、{},下面举几个简单的例子:

1,ls test* <== *表示后面不论接几个字符都接受(没有字符也接受),这个是和正则表达式中不同的一点

2,ls test? <== ?表示后面当且仅当接一个字符时才接受

3,ls test??? <== ???表示一定要接三个字符

4,cp test[1~5] /tmp <== test1, test2, test3, test4, test5若存在,则复制到/tmp目录下

5, rm myfile[!9] 将删除除 myfile9 之外的名为 myfile 加一个字符的所有文件 6, ll {*.zip,a?.awk}:{}表示一个集合,命令含义是列出所有以zip结尾的文件和所有a开头,后面跟一个字符以awk结尾的所有的文件


##### 正则表达式

正则表达式内容很多,只是看过往往记不住,需要常用才能掌握,所以下面根据平时遇到的正则问题将经常用到的进行更新

1.假设你在一篇英文小说里查找hi,你可以使用正则表达式hi,不幸的是,很多单词里包含hi这两个连续的字符,比如him,history,high等等。用hi来查找的话,这里边的hi会被找出来。如果要精确地查找hi这个单词的话,我们应该使用\bhi\b。

\b是正则表达式规定的一个特殊代码(好吧,某些人叫它元字符,metacharacter),代表着单词的开头或结尾,也就是单词的分界处。虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置。 如果需要更精确的说法,\b匹配这样的位置:它的前一个字符和后一个字符不全是(一个是,一个不是或不存在)\w。 假如你要找的是hi后面不远处跟着一个Lucy,你应该用\bhi\b.*\bLucy\b

2.上面\bhi\b.*\bLucy\b 中, .表示匹配除了换行符以外的 任意一个 字符,*表示 零次或多次 匹配前面的字符或子表达式,比如:zo* ,这里星号只对它的前一个字符o起作用,所以 o 可以出现零次或多次,所以可以匹配z,zo,zoo,zoo.., .*连在一起就意味着任意数量的不包含换行的字符

3.贪婪匹配和非贪婪匹配:

>>> str=’abdcdghc’
>>> print re.findall(‘ab.+?c’,str)
[‘abdc’]
>>> print re.findall(‘ab.+c’,str)
[‘abdcdghc’]

>>> print str
abdcdghc >>> print re.findall(‘.+c’,str)
[‘abdcdghc’]
>>> print re.findall(‘.+?c’,str)
[‘abdc’, ‘dghc’]

其中 + 代表匹配一次或多次
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。 有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧: a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。

更多

About me

就读于中山大学, 记录日常的学习和生活.

Links