python 正则表达式疑问

2013-04-23 10:50:28 +08:00
 mrbrooks
<td>数据:</td>
<td><img src="/123/abc.jpg" border="0" /></td>



<td>(.+?)</td> 可以匹配td之间的数据,比如上面的“数据:”
现在我想匹配上面的“数据:” 以及 “/123/abc.jpg”

我的理解是()得到想要的数据,然后 | 做类似的或操作
如果需要能匹配a模式或者b模式的,是不是应该这样 ((a)|(b))
也就是这样:
<td>((.+?)|<img src="(.+?)" border="0" />)</td>

但是经过测试达不到我想要的效果。
麻烦哪位大侠解答下,谢谢!
3711 次点击
所在节点    Python
7 条回复
cloverstd
2013-04-23 11:30:15 +08:00
你是想匹配得到 “数据” 和 “/123/abc.jpg” 吗?
woshifyz
2013-04-23 11:36:39 +08:00
你这个有两个问题,
第一:在选择条件外加捕获括号,这样会捕获外面的分组,改成(?:
第二:正则匹配分支条件是短路的,A|B,如果A可以匹配,不会匹配B,
所以你的匹配可以改为:<td>(?:<img src="(.+?)" border="0" />|?:(.+?))</td>
大概就是这个样子,没经过测试,你调试下应该就好了
woshifyz
2013-04-23 11:39:30 +08:00
...好吧,测过发现错了,
如果 <td>(?:<img src="(.+?)" border="0" />|(.+?))</td> ,这样的话,可以都匹配,但是当匹配 “数据” 时会有空分组,上面一个回答多了个?:
mrbrooks
2013-04-23 11:56:31 +08:00
@cloverstd 对的。
mrbrooks
2013-04-23 12:06:44 +08:00
@woshifyz 非常感谢, 你的这个方法可以,呵呵,但是跟你说的一样有空的分组。这个问题,或者不用这样的方法,有没有其他更方便的?
oldman
2013-04-23 13:19:44 +08:00
这种情况下我一般是先将<td></td>内的内容match下来,然后再取"/123/abc.jpg"(“数据”自然就会被略过了),自我感觉这样清晰一些,不知道这样是否可以满足LZ的需求
Kabie
2013-04-25 01:08:34 +08:00
http://stackoverflow.com/a/1732454/260985
请用lxml……
或者你不会xpath可以用pyquery提供的api
https://pypi.python.org/pypi/pyquery

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/66681

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX