正则表达式

  正则表达式是可以匹配文本片段的模式。最简单的正则表达式就是普通字符串,可以匹配其自身。

  在python中,re 模块包含了对正则表达式的支持

  通配符:

    正则表达式可以匹配多余一个的字符串,可以使用一些特殊字符来创建这类模式。

    点号 "." 可以匹配任何字符(除换行符)。so 使用正则表达式 '.ython' 能匹配 'qython','+ython',' ython',但'.' 只能匹配一个字母,二部是两个或零个。

    因为它可以匹配"任何字符串",点号就称为 通配符。

  对特殊字符进行转义:

    在正则表达式中如果将特殊字符作为普通字符使用会遇到问题,比如,假设需要匹配字符串'python.org',直接用'python.org' ,但这样也会匹配'pythoncorg'等,这可不是期望的结果,为了让特殊字符表现的像普通字符一样,需要对它进行转义---可以在它前面加上反斜线,在本例中'python\\.org' 就会匹配'python.org'了。

    ps:为了获得re模块所需的单个反斜线,我们要在字符串中使用两个反斜线,或者使用原始字符串 r'python\.org'.

  字符集

    可以使用中括号来创建字符集。字符集可以匹配它所包括对额任意字符,所以'[pj]yothon' 能够匹配'python' 和 'jython','[a-z]'能匹配a到z的任意一个字符,[a-zA-Z0-9]能匹配任意大小写字母和数字。'[Λabc]' 可以匹配任何出了a,b,c

    ps:字符集只能匹配一个这样的字符

  选择符和子模式

    如果字符串想匹配'python' 和 ‘perl’  所需的模式可以写成 'python|perl'  或者 p(ython|erl)  --子模式。

  可选项和重复子模式

    在子模式后面加上问号,就变成了可选项,它可能出现在匹配字符中,但非必须。如下面这个表达式:

 

r'(http://)?(www\.)?python\.org'  它只能匹配下列字符串(不会匹配其他的)
    'http://www.python.org'
    'http://python.org'
    'www.python.org'
    'python.org'

    问号 ? 表示 子模式 可以出现一次或者根本不出现。下面的这些运算符允许子模式重复出现多次:

    (pattern)*: 允许模式重复0次或多次;

    (pattern)+: 允许模式重复1次或多次;

    (pattern){m,n}: 允许模式重复m~n次。

  字符串的开始和结尾

    使用脱字符"Λ"标记开始  如  'Λht+p'  会匹配 'http://python.org' 或者 'htttttp://python.org' 但是不会匹配 'www.http.org';

    使用美元符号'$' 标记字符串结尾。

 

re 模块的内容

  重要的函数如下

compile(pattern[,flags)

根据包含正则表达式的字符串创建模式对象

search(pattern,string[,flags])

在字符串中寻找模式

match(pattern,string[,flags])

在字符串的开始出匹配模式

split(pattern,string[,maxsplit=0])

根据模式的匹配项来分割字符串

findall(pattern,string)

列出字符串中模式的所有匹配项

sub(pat,repl,string[,count=0])

将字符串中所有pat 的匹配项用repl替换

escape(string)

将字符串中所有特殊的正则表达式字符转义

 

  函数 re.compile 将 正则表达式(以字符串书写的)转换为模式对象,如果在调用search 或者 match 函数的时候使用字符串表示的正则表达式,他们也会在内部将字符串转换为正则表达式对象。 re.search(pat,string)  --->pat 是用字符串表示的正则表达式  等价于 pat.search(string) -->pat 使用 compile 创建的模式对象。

  re.search 会在给定的字符串中寻找第一个匹配给定正则表达式的字符串,一旦找到子字符串,函数就会返回MatchObject (值为true),否则返回None(值为false)

>>> if re.search(pat,string):
    print 'found it'

  re.match 会在给定的字符串的开头匹配正则表达式,因此  match('p','python') 返回真,而 re.match('p','www.ppp.com') 返回假(None)

  函数 re.split 会根据模式的匹配项来分给字符串。他类似于字符串的split,不过是用完整的正则表达式代替了固定的分割符字符串

>>> some_text = 'alph, beta, , , gama delta'
>>> re.split('[, ]+',some_text)      ---》 一个或多个 逗号 或 空格
['alph', 'beta', 'gama', 'delta']
#maxsplit 表示字符串最多可以分割的次数
>>> re.split('[, ]+',some_text,maxsplit = 2)
['alph', 'beta', 'gama delta']
>>> re.split('[, ]+',some_text,maxsplit = 1)
['alph', 'beta, , , gama delta']

  函数re.findall  以列表形式返回给定模式的所有匹配项。如下面的例子

>>> pat = '[a-zA-Z]+'     #不管是大写还是小写,一个或多个字符
>>> text = '"Hm... Err -- are you sure?" he said,sounding linsecure'
>>> re.findall(pat,text)
['Hm', 'Err', 'are', 'you', 'sure', 'he', 'said', 'sounding', 'linsecure']

  或者是查找标点符号

>>> pat = r'[.?\-",]+'
>>> re.findall(pat,text)
['"', '...', '--', '?"', ',']

  函数re.sub 的作用在于:使用给定的替换内容将匹配模式的子字符串(最左端且非重叠的字符串)替换掉。如下:

>>> pat = '{name}'
>>> text = 'Dear {name}'
>>> re.sub(pat,'MR ZHANG',text)
'Dear MR ZHANG'

  re.escape 是一个很使用的函数,他可以对字符串中所有可能被解释为正则运算符的字符进行转义的应用函数。

>>> re.escape('www.python.org')
'www\\.python\\.org'

   匹配对象和组

  对于re模块那些能够对字符串进行模式匹配的函数而言,当能找到匹配项的时候,他们都会返回MatchObject对象。这些对象包括匹配模式的子字符串的信息。他们还包含了哪个模式匹配了子字符串哪部分的信息 --这些部分叫做组(group)。

  简而言之,组就是防止在园阔以好内的子模式。组的序号取决于它左侧的括号数,组0就是整个模式,所以在下面的模式中:、

  'There (was a (wee)(cooper)) who(lived in Fyfe)' 包含下面这些组:

0 There was a wee cooper who liver in Fyfe
  1 was a wee cooper
  2 wee
  3 cooper
  4 lived in Fyfe

  一般来说,如果租中包含诸如通配符或者重复运算符之类的特殊字符,那么你可能会对是什么与给定的租实现了匹配感兴趣,比如下面的模式中:

  r'www\.(.+)\.com$'   ---> 组0 包含了整个字符串,组1 则包含位于 www. 和 .com 之间所有的内容了。

  re匹配对象的一些重要方法如下所示:

group([group1,,,,])

获取给定子模式(组)的匹配项

start([group])

返回给鼎足的匹配项的开始位置

end([group])

返回给鼎足的匹配项的开始位置(和分片一样,不包含组的结束位置)

span([group])

返回一个组的开始和结束位置

  

>>> import re
>>> m = re.match(r'www\.(.*)\..{3}','www.python.org')
>>> m.group(0)
'www.python.org'
>>> m.group(1)
'python'
>>> m.start(1)
4
>>> m.end(1)
10
>>> m.span(1)
(4, 10)

  作为替换的租和函数

    re.sub最强大的功能的最简单方式就是在 替换字符串中使用组号。在替换内容中以 ‘\\n’ 形式出现的任何转移序列都会被模式中与组n 匹配的字符创替换掉。例如假设要报 '*something*'用'<em>something</em>' 替换掉。

>>> pat = r'\*([∧\*]+)\*'
>>> re.sub(pat,r'<em>\1</em>','hello,*world*!')