Python正则表达式在cygwin上出乎意料地表现

时间:2014-02-01 10:48:45

标签: python regex python-2.7 cygwin x86-64

问题:

我正在尝试使用Python提取html页面的 body 从表面上看 - 它几乎是微不足道的(即:

'<body.*?>(.*)</body>', re.IGNORECASE|re.DOTALL)
实际上,有几个online regex verifiers证实了上述的有效性。

但是,当我尝试在我的环境中运行以下脚本时,匹配是 NoneType 。有什么想法吗?

测试脚本:

#!/bin/env python

import re
import urllib2

def display_html(f):
    print f.read()

def get_body(text):
    p = re.compile('<body.*?>(.*)</body>', re.IGNORECASE|re.DOTALL)
    print p, type(p)
    m = p.match(text)
    print m, type(m)

def get_html_text(url):
    f = urllib2.urlopen(url)
    return f

def to_text(f):
    return f.read()

if __name__ == "__main__":
    url = "http://www.ibm.com/us/en/" # A nicely formatted known page
    f = get_html_text(url) 
    html_text = to_text(f)
    body = get_body(html_text)

输出:

<_sre.SRE_Pattern object at 0xffe245c0> <type '_sre.SRE_Pattern'>
None <type 'NoneType'>

我的环境:

Python 2.7.3,CYGWIN_NT-6.1-WOW64 1.7.22(0.268 / 5/3)2013-07-22 17:06 i686 Cygwin,Windows 7 x86-64。

1 个答案:

答案 0 :(得分:1)

正则表达式很好。该网页中没有<body>标记。它没有身体,而是<frameset>

您需要使用re.search,而不是re.match。后者尝试匹配字符串开头的正则表达式。