python中关于正则表达式三
2015年8月14日
11:10
7.2正则表达式操作
正则表达式使用反斜杠字符'\'来暗示一些特殊的形式或者允许特殊的字符使用但是没有调用它们特殊的意思。在字符串常量中的相同目标的字符的python中的用法也是有冲突的,例如,为了匹配常量反斜杠,一个可能的是必须写'\\\\'作为模式字符串,因为正则表达式必须是\\,并且每个反斜杠必须是被镶嵌在有规律的python字符串常量中\\
一个对于使用python的原始字符串符号的正则表达式用法模式的解决办法是,反斜杠不会被处理用任何特殊方式用字符串常量前缀'r'。所以r'\n'就是一个两个字符的包含'\'和'n',当'\n'表示一个字符串的包含一个新行。通常模式将会在python代码中表示用这个原始的字符串标记。
我们需要注意大多数正则表达式操作符是可用的在模块水平的函数和正则对象方法中。函数是快捷方式不要求你首先完成正则对象,但是会遗漏一些微调的元素
7.2.1正则表达式语法
一个正则表达式(或者RE)指定一个可以和它匹配的字符串集合。在这个模块中的函数让你检查是否一个特别字符串会匹配被给的正则表达式(或者是否一个被给的正则表达式会匹配一个特别的字符串,这个可以归结为同样的事情)
正则表达式可以被串联为一种新的表达式;如果A和B都是正则表达式,那么AB也是一个正则表达式。通常,如果一个字符串p匹配A而且另一个字符串q匹配B,那么字符串pq将会匹配AB。这表示除非A或者B包含滴游戏操作;边界条件在A和B,或者有数字组的参考。从而,复杂的表达式可以容易地构造从更简单原始的表达式像一个描述这里。详细来看这个理论和正则表达式的实现,请教参考书在上面的,或者几乎任何的文本关于编译的构造。
下面是一个简单的正则表达式解释。为了更远的信息和一个更温和的描述,咨询正则表达式HOWTO.
正则表达式可以包含特指的和平凡的字符。大多数平凡的字符,如'A','a'或者'0',是最简单的正则表达式,它们简单地匹配它们自己。你能串联平凡的字符,所以最后的匹配字符'last'.(在本节的其余部分,我们在这种特殊风格来写RE,通常没有引用,而且字符可以被匹配在这个简单的引用中。
一些字符,像'|'或者'(',是特指的。特别的字符代表着普通字符的一类,或者影响正则表达式环绕它们被干扰。正则表达式的模式字符串可能不会包含null字节,但是可以空null字节使用\number 标识,例如 '\x00'
这些特殊的字符有:
'.' 点,在默认的模式中,这个匹配任何字符除了新的一行。如果DOTALL 标记已经被指定,这个匹配任何字符包括新的一行。
'^' ^插入符号,匹配字符串的开始,而且在MULTILINE(多行)模式的新的一行后也立即匹配
'$' 匹配字符串的结束或者仅仅在字符串末尾的新行开始前,并且在MULTILINE(多行)模式的新的一行行开始前也匹配。foo 匹配 'foo' 和 'foorbar',当正则表达式foo$匹配仅仅只能是'foo'。更有兴趣的是,搜索foo.*在 'foo1\nfoo2\n'匹配'foo2'正常,但是'foo1'在多行模式中是正常的。搜索一个简单的 $ 在'foo\n'将会发现两个(空的)匹配,一个就是在新的一行开始前,而另一个就是在字符串的末尾。
import re
pattern=re.compile('foo.$')
print re.findall(pattern,'foo1\nfoo2\n')
'*' 造成一个结果让RE去匹配0或者更多的重复在RE表达式,尽可能重复 。 ab*就是匹配'a' ,'ab',或者'a'后面跟随很多次的'b' 'a'后面跟随很多'b'这个要注意
'+' 造成一个结果RE去匹配1或者更多重复次数在RE表达式之前。 ab+ 就是匹配'a'后面跟随许多非0次的'b',他将不再匹配仅仅'a'
'?' 造成一个结果就是让RE去匹配0或者1次重复在RE表达式中。 ab?就是匹配
'a'或者'ab'
*?,+?,?? 这个'*','+'和'?'限定是所有的贪婪,它们尽可能地匹配文本。有时候这个行为不是渴望想得到的;如果RE表达式<.*>是竞争匹配'<H1>title</H1>',那么将会匹配整个字符串,而不仅仅是'<H1>'。添加'?'在这个限定符之后会让它执行匹配用非贪婪模式或者最小式样,在尽可能少的字符串会被匹配。用.*? 在先前的表达式中将会匹配仅仅<H1>
{m} 特别地这个m 复制了之前的RE应该是匹配,更少的匹配让整个RE表达式不去匹配。例如,a{6}将会精准匹配6个'a'字符,而不是5个
{m,n} 让产生结果导致RE表达式去匹配m到n个重复次数对于准备好的RE,尝试着去匹配尽可能的次数。例如,a{3,5}将会匹配从3到5次'a'字符。省略m次会有一个更小的边界,比如0.如果忽略n特指一个无限大的边界。作为一个例子,a{4,}b那么会 匹配 aaaab或者一千次'a'字符然后后面跟着一个b,而不是aaab。 这个逗号不能忽略或者修改,这将会混淆之前描述的内容。
{m,n}? 让产生结果导致RE去匹配从m到n次重复的表达式,尝试着去匹配尽可能少的次数。这是非贪婪的版本对之前之前的限定词。例如,在一个6次的字符串'aaaaaa',a{3,5}将会匹配 5'a'字符,然而a{3,5}?将仅仅匹配3个字符串。
'\' 转义符特指的字符(允许你去匹配像* ,?等等这些字符),或者一串特别的符号,尤其下述被讨论的序列。如果你不用一个原始的字符串去表示模式,记得python也在字符串序列中用反斜杠作为一个转义符;如果这个专业符序列不能识别被python的解析器,那么反斜杠和字序列是被包括在产生字符串中。然而,如果python识别了产生的字符串,反斜杠应该被重复两次。这是复杂和困难的去理解,所以强烈推荐用原始字符串对于所有而不是简单的表达式。