正则表达式学习笔记——

学习了一遍@deerchao 的正则表达式教程,回过头来分析一下2.2读取雅虎股票数据的代码。

首先选中股票数据表格中的一行:
这里写图片描述
然后查看这部分的源代码:

<tr><td class="yfnc_tabledata1"><b><a data-rapid_p="21" href="/q?s=AAPL">AAPLa>b>td><td class="yfnc_tabledata1">Apple Inc.td><td class="yfnc_tabledata1" align="right"><b>116.11b> <nobr><small>Nov 11small>nobr>td><td class="yfnc_tabledata1" align="right"><img style="margin-right:-2px;" src="http://l.yimg.com/os/mit/media/m/base/images/transparent-1093278.png" class="neg_arrow" alt="Down" border="0" height="14" width="10"> <b style="color:#cc0000;">0.66b> <b style="color:#cc0000;"> (0.57%)b>td><td class="yfnc_tabledata1" align="right">45,223,045td>tr>

教材中使用的代码如下:

import urllib
import re
dStr = urllib.urlopen('http://finance.yahoo.com/q/cp?s=%5EDJI+Components').read()
m = re.findall('\
(.*?)(.*?).*?(.*?).*?', dStr)

if m:
    print m
    print '\n'
    print len(m)
else:  
    print 'not match'

发现对不上啊,href= 中间明明还有其它字符,怎么没有正则表达式来匹配呢?

那么把条件判断的部分注释掉,然后print dStr ,得到下面的HTML代码,与直接通过浏览器查看源码有些诧异,少了CSS的部分:

<tr><td class="yfnc_tabledata1"><b><a href="/q?s=AAPL">AAPLa>b>td><td class="yfnc_tabledata1">Apple Inc.td><td class="yfnc_tabledata1" align="right"><b>116.11b>

这里就是需要注意的第1点:
python读取到的html源码与浏览器查看到的源码不一样!

至于为什么,怎样规避,以后再学吧。还有需要注意的第2点:
Spyder可以在正则表达式中间插入(?#Comment),但是只能使用英文字符,不能使用中文,否则会出错。
怎样插入中文注释,以后再研究。

最后研究一下教材使用的正则表达式,其实很简单:

'       #单引号,表示开始查找字符串咯
               #一对一匹配元字符
\       #在python中代码换行
(.*?)       ###匹配任意连续字符并将其分组,然后会被re.findall读取
               #一对一匹配元字符
(.*?)       ###匹配任意连续字符并将其分组,然后会被re.findall函数读取
       #一对一匹配元字符
.*?     #匹配任意连续字符,但不对其分组,也不会被re.findall函数读取
     #一对一匹配元字符
(.*?)       ###匹配任意连续字符并将其分组,然后会被re.findall函数读取
        #一对一匹配元字符
.*?     #匹配任意连续字符,但不对其分组,也不会被re.findall函数读取
       #一对一匹配元字符
'       #字符串结束

又发现了需要注意的第三点:
@deerchao 的正则表达式教程里,/ 也需要转义,用\/ 来表达。但是在python中,显然不需要对/ 进行转义,直接用就行了。

最后,print m 的结果是个列表:

[(‘AAPL’, ‘Apple Inc.’, ‘116.11’), (‘AXP’, ‘American Express Company’, ‘72.91’), (‘BA’, ‘The Boeing Company’, ‘144.99’), (‘CAT’, ‘Caterpillar Inc.’, ‘71.91’), (‘CSCO’, ‘Cisco Systems, Inc.’, ‘27.82’), (‘CVX’, ‘Chevron Corporation’, ‘92.19’), (‘DD’, ‘E. I. du Pont de Nemours and Company’, ‘67.00’), (‘DIS’, ‘The Walt Disney Company’, ‘116.52’), (‘GE’, ‘General Electric Company’, ‘30.67’), (‘GS’, ‘The Goldman Sachs Group, Inc.’, ‘197.39’), (‘HD’, ‘The Home Depot, Inc.’, ‘124.71’), (‘IBM’, ‘International Business Machines Corporation’, ‘135.02’), (‘INTC’, ‘Intel Corporation’, ‘32.86’), (‘JNJ’, ‘Johnson & Johnson’, ‘101.86’), (‘JPM’, ‘JPMorgan Chase & Co.’, ‘67.35’), (‘KO’, ‘The Coca-Cola Company’, ‘42.04’), (‘MCD’, “McDonald’s Corp.”, ‘113.85’), (‘MMM’, ‘3M Company’, ‘159.05’), (‘MRK’, ‘Merck & Co. Inc.’, ‘53.72’), (‘MSFT’, ‘Microsoft Corporation’, ‘53.65’), (‘NKE’, ‘NIKE, Inc.’, ‘127.42’), (‘PFE’, ‘Pfizer Inc.’, ‘33.74’), (‘PG’, ‘The Procter & Gamble Company’, ‘75.96’), (‘TRV’, ‘The Travelers Companies, Inc.’, ‘114.38’), (‘UNH’, ‘UnitedHealth Group Incorporated’, ‘114.54’), (‘UTX’, ‘United Technologies Corporation’, ‘98.26’), (‘V’, ‘Visa Inc.’, ‘79.18’), (‘VZ’, ‘Verizon Communications Inc.’, ‘45.32’), (‘WMT’, ‘Wal-Mart Stores Inc.’, ‘57.58’), (‘XOM’, ‘Exxon Mobil Corporation’, ‘81.62’)]

你可能感兴趣的:(python)