正则表达式备忘

真正开始学习正则表达式是从linux开始的,那时候看了皓哥的sed入门和awk的入门文章,里面涉及到了很多正则表达式的东西。

如果说sed、awl、grep、find要玩的好一定得把正则表达式玩的好。以下是我的一些总结,主要是针对自己的一些误解的解决。

1.区分ERE和BRE

      在写正则表达式的时候一定要区分到底用的是基本的正则表达式还是扩展的正则表达式。扩展的正则表达式支持|,但是不支持分组。

      在linux里面,sed、grep用的是基本正则表达式,grep -E、awk用的是扩展正则表达式。

2.区分正则表达式和原始字符串

      我一开始把python的原始字符串和正则表达式的关系弄混了,导致了一些误解。

   2.1.实际上原始的字符串,比如r'\n'打印出来不是换行,而是\n。

         也就是说转义字符在原始字符串中失效,这个在linux里面和单引号是一样的。

   2.2.原始字符串在正则表达式中可能会有特殊含义.

          比如*,.*等等,还有比如\b,这些东西只有在正则表达式中才会成立,离开了正则表达式就是普通的字符。

3.其他关于python RE的

         match是从字符串行首开始匹配,而research是从字符串行首开始查找,故search可以匹配串中的位置。
         字符串匹配后会把匹配的结果放入返回的对象的group属性中,如果正则表达式中含有分组,则可以通过group(id)来访问
         对于有分组的情况,所有分组还会放在属性groups()中,他是一个元组,可以通过下标访问。
         对于含有锚点的正则表达式,只适用于research,因为match肯定会从行首匹配。
         如果想找到所有的匹配咋搞?用findall,它返回匹配的列表。注意如果这时候正则表达式含有子组,则会返回子组的列表。
         正则表达式进行替换则包括sub和subn,唯一区别是subn会返回元组,包括替换完成后的字符串和替换次数。
         注意别把正则表达式中的特殊字符和ASCII特殊字符搞混了。

4.反斜杠

    python正则中的反斜杠很容易让人搞混,这里特殊说明下:

    4.1. python普通字符串中的反斜杠,此时反斜杠是用来转义的,如果后面的字母和它配成转义字符,则那个字母表示了特殊的含义,比如'\t'表示tab,但是如果不构成转义,那么还是普通的反斜杠,比如'\s'就是字符串\s,不会转义s的。

    4.2. 加了r的普通字符,此时,r中的反斜杠就是普通的反斜杠,不会转义后面的字符。即r'\t'就是"\t",而不是tab。

    4.3. 正则表达式中的反斜杠,用来转义正则表达式中的特殊字符的,比如'\d'表示任意的数字,这里就不存在4.1中的情况,匹配不到转义字符就是匹配不到,不会作为普通的反斜杠的。因此,如果在正则中要匹配反斜杠自身,则要通过r'\\'或'\\\\'来匹配。这里容易弄混,切记!

eg:

>>> import re
>>> s = '\t'
>>> s
'\t'
>>> print s
	
>>> s = '\s'
>>> s
'\\s'
>>> print s
\s
>>> s = r'\t'
>>> s
'\\t'
>>> print s
\t
>>> s = r'\s'
>>> print s
\s
>>> s = '\x5c'
>>> print s
\
>>> re.match(r'\\', s)
<_sre.SRE_Match object at 0x10cd66850>
>>> re.match('\\\\', s)
<_sre.SRE_Match object at 0x10cd668b8>
>>> import re
>>> s = '123'
>>> re.match('\d', s)
<_sre.SRE_Match object at 0x105d08850>
>>> re.match('\\d', s)
<_sre.SRE_Match object at 0x105d088b8>
>>> re.match(r'\\d', s)
>>> re.match(r'\d', s)
<_sre.SRE_Match object at 0x105d08850>

 

5. re.compile(strPattern[, flag]):

这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。 第二个参数flag是匹配模式,取值可以使用按位或运算符'|'表示同时生效,比如re.I | re.M。另外,你也可以在regex字符串中指定模式,比如re.compile('pattern', re.I | re.M)与re.compile('(?im)pattern')是等价的。 
可选值有:

    • re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)
    • M(MULTILINE): 多行模式,改变'^'和'$'的行为(参见上图)
    • S(DOTALL): 点任意匹配模式,改变'.'的行为
    • L(LOCALE): 使预定字符类 \w \W \b \B \s \S 取决于当前区域设定
    • U(UNICODE): 使预定字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性
    • X(VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。

posted on 2015-05-29 20:07  chybot  阅读(188)  评论(0编辑  收藏  举报