初学正则的两个小问题

2013-04-02 08:41:44 +08:00
 ivanlw
1.正文
<html>
<head>
<title></title>
</head>
<body>
<div>test</div>
<h3>hh33</h3>
<p>asdf</p>
</body>
</html>
想取出<div></div>之间和<p></p>之间的东西,用:
<div>(.*)</div>[^.]*<p>(.*)</p>
就能找出来,但是换了:
</div>(.*)</div>[.\n\s\r]*<p>(.*)</p>
就匹配出不来了?
感觉两对角标之间的那些东西,就是换行符、空白符、再加上.,应该就能全部找到了吧?但是实际不行?

2.尝试着用python来进行正则匹配
import re
p = re.compile('xml') #define re:p
m = p.match('xml') #这样子m就有内容<_sre.SRE_Match object at 0x101a82100>
但是换成:
m = p.match('<xml') #这样子m就是None
#
想了下,<好像不用需要转义字符吧?
2047 次点击
所在节点    正则表达式
17 条回复
keakon
2013-04-02 10:03:05 +08:00
你想丢弃 h3 的话,直接 .*? 就行了。

或者保险点,[^<]*。
gastlygem
2013-04-02 11:04:14 +08:00
关于问题2,match是全字符串匹配,如果你想要匹配部分字符串,你需要用 m = p.search('<xml')
young
2013-04-02 11:09:45 +08:00
1楼正解 关键在于那个?号 呵呵
doskoi
2013-04-02 11:16:35 +08:00
我记得看过一篇不要用正则去解析html, 所以用XPath把
ivanlw
2013-04-02 12:17:39 +08:00
@doskoi 能麻烦发一下那篇文章吗……我看到的都是说用库比较慢,用正则比较快的……
yangg
2013-04-02 12:20:51 +08:00
1. </div>(.*)</div>[\s\S]*?<p>(.*)</p>

2. 第二个换search方法就行了,match是从开始匹配, re.match(pattern, string, flags=0)
If zero or more characters at the beginning of string match the regular expression pattern, return a corresponding MatchObject instance.
http://docs.python.org/release/2.7.3/library/re.html?highlight=re.match#re.match

ps:解析html可以用BeautifulSoup
ivanlw
2013-04-02 12:52:09 +08:00
@young 问号不是0次或者一次的意思么,那.*?应该怎么理解?
hidden
2013-04-02 14:18:28 +08:00
@ivanlw <p>.*?</p> 后面那个问号表示非贪婪模式,遇到第一个</p>就停,不然会继续找后面的</p>

http://zh.wikipedia.org/wiki/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F
halfelf
2013-04-02 14:48:42 +08:00
不要用正则解析html/xml等,正则无法完整无误的解析,况且有各种各样的xpath轮子,还用自己写
http://stackoverflow.com/questions/590747/using-regular-expressions-to-parse-html-why-not
young
2013-04-02 21:19:51 +08:00
@ivanlw @hidden 正解
ivanlw
2013-04-02 23:10:15 +08:00
@keakon 你指的是:
<div>(.*)</div>.*?<p>(.*)</p>
吗,这样子匹配不出来……
ivanlw
2013-04-02 23:11:15 +08:00
@yangg 你的这个正则匹配不出来
ivanlw
2013-04-03 03:43:31 +08:00
@keakon
用的是开源中国的在线正则测试,不知道这个工具会不会有什么问题……google搜出来的
http://imgur.com/FseGnWR
ivanlw
2013-04-03 03:47:46 +08:00
@yangg 哦,sorry,测试出来了……这个可以的……

想知道下中间部分如果用[.\n]*?为什么不可以……
我看的教程是.表示除了\n以外的所有字符,然后[]表示的是中间出现的情况都可以,所以觉得[.\n]应该是包含所有的情况了……
keakon
2013-04-03 10:44:20 +08:00
@ivanlw 有个东西叫 re.DOTALL
yangg
2013-04-03 11:11:51 +08:00
@ivanlw [.\n]不行,是因为.在[]里不转义就表示 字符".",而不是any character except newline,
所以[.\n]只是两个字符
http://rubular.com/r/BT2pdwyprG

python里可以开启DOTALL模式 (?s)<div>(.*?)</div>.*?<p>(.*?)</p>
ivanlw
2013-04-03 13:03:37 +08:00
@yangg 多谢!如果不用python的话,正常应该怎么转义呢?这个好像不是简单的\.吧?(因为我试了\.不行)

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

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

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

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

© 2021 V2EX