python 正则匹配文本并返回字典列表

本文记录了使用Python正则表达式匹配网页table元素内容的学习过程。通过示例代码展示了如何进行匹配,并提供了相关参考资料链接,旨在探讨正则在文本处理中的应用。

今天有遇到要匹配网页的table元素里面的内容,部分内容为

<tr >
    <td>60</td>
    <td><a>leeliao</a></td>
    <td><a>leeliao</a></td>
    <td>¥56.82 元</td>
    <td>¥56.82元</td>
    <td>2014-08-11 23:33:54</td>
    <td>手动</td>
    <td><div class='iconBidState0' /></td>
</tr>


<tr >
    <td>61</td>
    <td><a>luo321654</a></td>
    <td><a>luo321654</a></td>
    <td>¥4,000.00 元</td>
    <td>¥4,000.00元</td>
    <td>2014-08-11 23:34:32</td>
    <td>手动</td>
    <td><div class='iconBidState0' /></td>
</tr>

我想要匹配每一个<tr>里面的头两个<td>,用python的正则加findall函数便可实现。但是要想获取类似字典一样的匹配(即可以通过group('key')类似的形式获取值得话),我需要对正则进行进一步改造。

我写的正则为

r'''<td>(?P<number>\d+)</td>.*?<td><a>(?P<name>\w+)</a></td'''

(?P<name>...)的形式是用命名的形式分组,可以生成对应name的字典

实现功能的全部代码是


r = re.compile(r'''<td>(?P<number>\d+)</td>.*?<td><a>(?P<name>\w+)</a></td''', re.S)
result = re.finditer(r, content)

print [m.groupdict() for m in result]


得到的最终结果

[{'number': '60', 'name': 'leeliao'}, {'number': '61', 'name': 'luo321654'}]

这里的groupdict是返回匹配到的所有命名子组的字典,至于为什么不用findall呢,这是因为findall最后返回的是匹配到的字符元组,类似

[('60',  'leeliao'), ( '61',  'luo321654')]
而finditer返回一个正则匹配的一个对象。

具体可以参考http://stackoverflow.com/questions/3765024/different-behavior-between-re-finditer-and-re-findall


正则是一个强大的工具,需要我慢慢摸索学习,以此文记录学习的过程。

有错漏之处,欢迎指正。


参考文章:

http://junlee.blog.51cto.com/228061/555895

http://stackoverflow.com/questions/11103856/re-findall-which-returns-a-dict-of-named-capturing-groups

https://docs.python.org/2/library/re.html














评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值