2.12.1. 正则基本功能

语系对正则表达式的影响

在linux下执行正则表达式,要考虑语系环境所带来的影响,LANG=C和LANG=zh_CN.gb2312时,[a-z]所选取的范围是不同的:

LANG=C,使用ascii编码,a-z表示的就是a-z,字母排列方式是A,B,C,D……Z 然后a,b,c,d……z
LANG=zh_CN.gb2312,使用的是gb2312语系,排列方式为: a,A,b,B,c,C……z,Z

正则的基本语法

在linux的常用工具如grep,sed,awk中,基础的正则表达式并没有正闭包+(可以用cc*来等价c+),另外也没有d,w,s等转义符,拥有的正则表达式字符为:

^ 匹配行首
$ 行尾
. 除换行外的任意字符(在英文环境下)
任意字符用[\s\S]代替(包括汉字)
* 闭包区间
[] 字符集合
[c1-c2] 字符区间 (和语系变量LANG有关)
[^] 字符集合之外
{n,m} 限定匹配次数范围

正则扩展语法

在linux的常用工具中,也提供了一些扩展的正则语法,如grep在执行时加上-E参数,,即可支持这些扩展语法:

+ 正闭包,c+等价cc*
? 0或1次匹配,等价{0,1}
| 或运算符,,(注意优先级低于连续和括号)
() 组运算符,用于为或运算符|提供连续的 字符组,优先级高于连续

特殊符号

前面说语系对字符范围[]是有影响的,所以为了避免影响,linux下为正则表达式制订了一些特殊符号,可以表示字符范围,如下:

[:alnum:] 0-9 A-Z a-z 同w
[:alpha:] A-Z a-z
[:blank:] 空格和tab
[:cntrl:] 代表控制按键,入CR LF tab del等
[:digit:] 0-9
[:graph:] 空格和tab之外
[:lower:] a-z
[:upper:] A-Z
[:space:] 任何会产生空白的字符 空格 tab CR
重要的记住[:alnum:] [:alpha:] [:upper:] [:lower:] [:digit:]即可

其他

http://www.tutorialspoint.com/python/python_reg_expressions.htm

(?:<xxxxx>)    不创建后向引用的group

特殊字符:

\d             数字 [0-9]
\D             非数字 [^0-9]
\s             空白字符[ \t\r\n\f]
\S             非空白字符[^ \t\r\n\f]
\w             单词字符[A-Za-z0-9_]
\W             非单词字符[^A-Za-z0-9_]

\A匹配输入字符串的开始位置
\Z匹配输入字符串的结束位置
\r回车\f换页\v垂直的TAB
'^'(脱字符)匹配输入字符串的开始位置,如果设置了re.MULTILINE标志,‘^’也匹配换行符之后的位置
'$'匹配输入字符串的结束位置,如果设置了re.MULTILINE标志,‘^’也匹配换行符之前的位置
\b匹配一个单词边界,单词定义为Unidcode的字母数字或下划线字符
\B匹配非单词边界,跟\b相反
\d 对于Unicode(str类型)模式:匹配任何一个数字,包括[0-9]和其他数字字符
    如果开启了re.ASCII,只匹配 [0-9]
\D与\d相反,如果开启了re.ASCII,只匹配 [^0-9]
\s 对于Unicode(str类型)模式:匹配Unicode中的空白字符(包括[\t\n\v\f\r]以及其他空白字符)
    如果开启了re.ASCII标志,就只匹配[\t\n\f\v\r]
\S与\s相反,如果开启了re.ASCII标志,就只匹配[^\t\n\f\v\r]
\w于Unicode(str类型)模式:匹配任何Unicode的单词字符,基本上所以语言的字符都可以匹配,包括数字和下划线
    如果开启了re.ASCII,只匹配[0-9a-zA-Z_]
\W与\w相反,如果开启了re.ASCII,只匹配[^0-9a-zA-Z_]
\u,\U只有在Unicode模式下才被识别

Note

A,Z,b,^,$都是零宽断言