爬虫之路——DAY2

$的问题

匹配行尾,行尾被定义为要么是字符串尾,要么是一个换行字符后面的任何位置。

>>> 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( ) 匹配的是字符串的开始,如果有不在字符串开始但是匹配给定模式的子字符串,用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)
['']
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值