正则表达式学习笔记——

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

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

<tr><td class="yfnc_tabledata1"><b><a data-rapid_p="21" href="/q?s=AAPL">AAPL</a></b></td><td class="yfnc_tabledata1">Apple Inc.</td><td class="yfnc_tabledata1" align="right"><b>116.11</b> <nobr><small>Nov 11</small></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.66</b> <b style="color:#cc0000;"> (0.57%)</b></td><td class="yfnc_tabledata1" align="right">45,223,045</td></tr>

教材中使用的代码如下:

import urllib
import re
dStr = urllib.urlopen('http://finance.yahoo.com/q/cp?s=%5EDJI+Components').read()
m = re.findall('<tr><td class=\"yfnc_tabledata1\"><b><a href=\".*?\">\
(.*?)</a></b></td><td class=\"yfnc_tabledata1\">(.*?)</td>.*?<b>(.*?)</b>.*?</tr>', dStr)

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

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

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

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

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

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

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

'       #单引号,表示开始查找字符串咯
<tr><td class=  #一对一匹配元字符
\"      #转义字符,表示后面是个"
yfnc_tabledata1 #一对一匹配元字符
\"      #转义字符,表示后面是个"
><b><a href=    #一对一匹配元字符
\"      #转义字符,表示后面是个"
.*?     #.匹配任意字符,*表示出现任意次(含0次),?表示重复最少次数
\"      #转义字符,表示后面是个"
>               #一对一匹配元字符
\       #在python中代码换行
(.*?)       ###匹配任意连续字符并将其分组,然后会被re.findall读取
</a></b></td><td class=  #一对一匹配元字符
\"      #转义字符,表示后面是个"
yfnc_tabledata1 #一对一匹配元字符
\"      #转义字符,表示后面是个"
>               #一对一匹配元字符
(.*?)       ###匹配任意连续字符并将其分组,然后会被re.findall函数读取
</td>       #一对一匹配元字符
.*?     #匹配任意连续字符,但不对其分组,也不会被re.findall函数读取
<b>     #一对一匹配元字符
(.*?)       ###匹配任意连续字符并将其分组,然后会被re.findall函数读取
</b>        #一对一匹配元字符
.*?     #匹配任意连续字符,但不对其分组,也不会被re.findall函数读取
</tr>       #一对一匹配元字符
'       #字符串结束

又发现了需要注意的第三点:
@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’)]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值