$的问题
匹配行尾,行尾被定义为要么是字符串尾,要么是一个换行字符后面的任何位置。
>>> print re.search('}$', '{block}')
<re.MatchObject instance at 80adfa8>
>>> print re.search('}$', '{block} ')
None
>>> print re.search('}$', '{block}\n')
<re.MatchObject instance at 80adfa8>
关于 match 与 search
match( ) 匹配的是字符串的开始,如果有不在字符串开始但是匹配给定模式的子字符串,用match不能匹配;而search()可以用来匹配在任意地方的子字符串
>>> re.match("c", "abcdef") # No match
>>> re.search("c", "abcdef") # Match
<_sre.SRE_Match object; span=(2, 3), match='c'>
而用 ^ 可以限定search所搜索的地方是字符串的开始处
>>> re.match("c", "abcdef") # No match
>>> re.search("^c", "abcdef") # No match
>>> re.search("^a", "abcdef") # Match
<_sre.SRE_Match object; span=(0, 1), match='a'>
在 MULTILINE 模式中,match( )也只能匹配字符串的最开始,而search()可以匹配每行的匹配字符。
>>> re.match('X', 'A\nB\nX', re.MULTILINE) # No match
>>> re.search('^X', 'A\nB\nX', re.MULTILINE) # Match
<_sre.SRE_Match object; span=(4, 5), match='X'>
再来几个例子
>>> str="2007 log_a\n2008 log_b\n2009 log_c"
>>> m = re.match("^\d.*$") # no match
>>> m = re.match("^\d.*", str) # match 2007 log_a
>>>> m = re.match("^\d.*$", str, re.M) # match 2007 log_a
>>> m = re.search("^\d.*", str) # match 2007 log_a
>>> m = re.search("^\d.*$", str) # no match
>>> m = re.search("^\d.*$", str, re.M) # match 2007 log_a
>>> print(re.findall("^\d.*$", str))
[]
>>> print(re.findall("^\d.*$", str, re.M))
['2007 log_a', '2008 log_b', '2009 log_c']
简单总结一下,#不一定对#
首先,match( )和search( )都只能匹配到一个字符串,即使是在MULTIPLE模式下也只能匹配到一个字符串。区别在于match( )只能匹配字符串的开头处,而search( )可以匹配不用的地方,所以search( )在MULTIPLE模式下会按顺序查找,返回第一个找到匹配的字符串。在需要查找许多匹配的字符串的时候,还是要通过findall( )来查找。同时还需要注意$与re.M的问题,当没有re.M的情况下,$表明为只是简单的整个字符串的末尾,而有re.M的条件下,$表示每一行的结尾。
匹配不包含的字符串
>>> str='<input type="text" id="xxx" name="xxx" value="xxx" />\n<input type="hidden" id="xxx" name="xxx" value="xxx" /> '
>>> m =re.findall("^(?!.*?hidden).*?$", str, re.M)
>>> print(m)
['<input type="text" id="xxx" name="xxx" value="xxx" />']
>>> m =re.findall("^(?!.*?hidden.*?$)", str, re.M)
>>> print(m)
['']