初学正则表达式的两个小问题

ivanlw 2013-04-02 09:13:37
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
#
想了下,<好像不用需要转义字符吧?
...全文
232 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly0snow 2014-02-18
  • 打赏
  • 举报
回复
引用 12 楼 syeerzy 的回复:
一年以后没事翻翻老贴, 我以为只是楼主粗心大意. 怎么整个帖子这么多人每个都粗心大意么? 这个问题跟程序没关系, 他后面的标签是 h3, 用 p 去匹配怎么可能匹配到嘛. 所以我说, 匹配到的那个是因为错了2个地方抵消了..... 真感叹,都是写代码的,怎么看东西都这么粗心呢?
第二个问题不用说了,第一个问题有几个错误: 1.第一个div前面多了/ 2.在[]中,.不是元字符,只匹配.号,并不是匹配除了换行符之外的任何字符。\s包括\n\r\t以及空格。 3.知道了上面那个错误,就知道应该用[\s\w<>\/] 我觉得你对正则有点理解不太正确啊。不要说div标签后面跟着的只是一个h3标签,就是有几百个其他标签,也可以用[\s\w<>\/]*都匹配掉,最终让<p>匹配成功啊。\s可是可以匹配换行的。 而且不知道你说的第一个正则错了两个地方是哪两个地方。我只是觉得他[^.]算是歪打正着了。
syeerzy 2014-02-18
  • 打赏
  • 举报
回复
一年以后没事翻翻老贴, 我以为只是楼主粗心大意. 怎么整个帖子这么多人每个都粗心大意么? 这个问题跟程序没关系, 他后面的标签是 h3, 用 p 去匹配怎么可能匹配到嘛. 所以我说, 匹配到的那个是因为错了2个地方抵消了..... 真感叹,都是写代码的,怎么看东西都这么粗心呢?
ivanlw 2013-04-03
  • 打赏
  • 举报
回复
引用 5 楼 zhaojia1989 的回复:
1、<div>(.*)</div>[.\n\s\r]*<p>(.*)</p> 2、search 另:所有的compile都写成原字符,compile(r'xml')
1.第二个正则确实写错了,但是去掉/,写成你这个样子,还是不能匹配出来呀,我用的是开源中国的在线正则表达式测试:http://www.ostools.net/regex 2.search明白了
ImN1 2013-04-03
  • 打赏
  • 举报
回复
你为什么迷信第三方?而不是自己写个python测试? 那个在线不能匹配,是基于自身原因——似乎是不认\n\r <div>(.*?)</div>[\S\s]*?<p>(.*?)</p> <div>(.*?)</div>[\D\d]*?<p>(.*?)</p> 这些应该都可以,其实正则不是一个写法,看你如何变通
ivanlw 2013-04-03
  • 打赏
  • 举报
回复
引用 9 楼 snmr_com 的回复:
引用 8 楼 ivanlw 的回复:引用 5 楼 zhaojia1989 的回复:1、<div>(.*)</div>[.\n\s\r]*<p>(.*)</p>
2、search

另:所有的compile都写成原字符,compile(r'xml')

1.第二个正则确实写错了,但是去掉/,写成你这个样子,还是不能匹配出来呀,我用的是开源中国的在线正则表达式测试:……


我用开源中国的在线正则测试:http://www.ostools.net/regex
正则表达式换成六楼的:<div>(.*?)</div>.*?<p>(.*?)</p>还是没有匹配结果
ImN1 2013-04-03
  • 打赏
  • 举报
回复
引用 8 楼 ivanlw 的回复:
引用 5 楼 zhaojia1989 的回复:1、<div>(.*)</div>[.\n\s\r]*<p>(.*)</p> 2、search 另:所有的compile都写成原字符,compile(r'xml') 1.第二个正则确实写错了,但是去掉/,写成你这个样子,还是不能匹配出来呀,我用的是开源中国的在线正则表达式测试:http://www.ostools……
要加r在前面,看#6的写法
ivanlw 2013-04-02
  • 打赏
  • 举报
回复
引用 3 楼 snmr_com 的回复:
那两个我只当是发帖打错了,如果真是低级错误就真是很无语 不过^也不像打错弄出来的,嘿嘿
呃,我真的是初学的,这两个是第一次写的正则,能麻烦告诉下应该怎么写才正确吗
ImN1 2013-04-02
  • 打赏
  • 举报
回复
那两个我只当是发帖打错了,如果真是低级错误就真是很无语 不过^也不像打错弄出来的,嘿嘿
syeerzy 2013-04-02
  • 打赏
  • 举报
回复
1 跟贪婪无关, 这是个"低级错误", 第一个所以可以,是因为犯两个低级错误,抵消了....第2个之所以不行,因为本来就不行,至于为什么说低级错误,你自己仔细看你写的东西.....跟正则或编程知识没关系,只跟仔细不仔细有关系. 2 python 的match是从开始匹配的, 如果你要像其他语言平台的match,应该用findall
crifan 2013-04-02
  • 打赏
  • 举报
回复
具体问题,就不再解释了,别人都解释过了。 说个相关的: 如果你只是处理此处简单的html,那么用正则,足够。 如果是处理更加复杂的,采用专门处理html的一些库函数,会相对更加高效和省力。 比如: 【教程】Python中第三方的用于解析HTML的库:BeautifulSoup 关于python的正则,我写了教程,感兴趣的话,你可以看看: 【教程】详解Python正则表达式
ImN1 2013-04-02
  • 打赏
  • 举报
回复
1.考虑一下贪婪与非贪婪 2.match应该是从头开始匹配的
libralibra 2013-04-02
  • 打赏
  • 举报
回复
直接提取就行了,
>>> s = '''<html>
    <head>
        <title></title>
    </head>
    <body>
        <div>test</div>
        <h3>hh33</h3>
        <p>asdf</p>
</body>
</html>'''
>>> import re
>>> res = r'<div>(.*?)</div>.*?<p>(.*?)</p>'
>>> m = re.findall(res,s,re.S|re.M)
>>> m
[('test', 'asdf')]
>>> 
zhaojia1989 2013-04-02
  • 打赏
  • 举报
回复
1、<div>(.*)</div>[.\n\s\r]*<p>(.*)</p> 2、search 另:所有的compile都写成原字符,compile(r'xml')

37,721

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧