鱼C论坛

 找回密码
 立即注册
查看: 2797|回复: 6

正则表达式

[复制链接]
发表于 2017-3-9 23:32:55 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 什么鬼… 于 2017-3-9 23:34 编辑
import urllib.request
import re

search = input('输入你要查找的内容:')
qury ={ 'search':search,
        'title':'Special:搜索',
        'go':'前往'}
qury = urllib.parse.urlencode(qury)
url = 'https://zh.wikipedia.org/w/index.php?'+str(qury)
content = urllib.request.urlopen(url).read().decode('utf-8')

title_list = re.findall(r'<a href="(?:[^!]+)" title="([^"]+)" data-serp-pos="(?:[0-9]+)">',content)

    

代码如上,我搜索的内容是:"我是”      (随意输入的,只是想先调试一下,idle中的输入我没有带引号,这里是为了表明我的输入内容)
运行后print(title_list)然后输出值只有两个title,表示完全不理解,明明应该把所有的title都输出的
我把一个满足的标签进行调试比如
>>> re.findall(r'<a href="(?:[^!]+)" title="([^"]+)" data-serp-pos="(?:[0-9]+)">','<a href="/wiki/%E5%81%87%E5%A6%82%E6%88%91%E6%98%AF%E6%AD%A6%E6%9D%BE" title="假如我是武松" data-serp-pos="0">')
['假如我是武松']
>>> 
但是问题来了
>>> re.findall(r'<a href="(?:[^!]+)" title="([^"]+)" data-serp-pos="(?:[0-9]+)">','<a href="/wiki/%E5%81%87%E5%A6%82%E6%88%91%E6%98%AF%E6%AD%A6%E6%9D%BE" title="假如我是武松" data-serp-pos="0"><a href="/wiki/%E6%88%91%E6%98%AF%E4%B8%80%E7%89%87%E4%BA%91" title="我是一片云" data-serp-pos="2">')
['我是一片云']
>>> 
结果只输出了一个值,这个最起码应该输出两个吧,我确实不知道问题出在哪了,希望有人可以来解答一下.....

最佳答案

查看完整内容

正则表达式错了,原正则: r'> import re >>> str2='' >>> re.findall(r'', str2) ['假如我是武松', '我是一片云']
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-3-9 23:32:56 | 显示全部楼层
本帖最后由 donkkong 于 2017-3-10 17:33 编辑

正则表达式错了,原正则:
r'<a href="(?:[^!]+)" title="([^"]+)" data-serp-pos="(?:[0-9]+)">'
按你要求需要搜索出两条记录,更改后正则:
r'<a href="(?:[^"]+)" title="([^"]+)" data-serp-pos="(?:[0-9]+)">'

怕你看不到哪里改了,长气地交待一下,问题出在叹号上 :r'<a href="(?:[^!             <-----------
>>> import re

>>> str2='<a href="/wiki/%E5%81%87%E5%A6%82%E6%88%91%E6%98%AF%E6%AD%A6%E6%9D%BE" title="假如我是武松" data-serp-pos="0"><a href="/wiki/%E6%88%91%E6%98%AF%E4%B8%80%E7%89%87%E4%BA%91" title="我是一片云" data-serp-pos="2">'

>>> re.findall(r'<a href="(?:[^"]+)" title="([^"]+)" data-serp-pos="(?:[0-9]+)">', str2)
['假如我是武松', '我是一片云']
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-3-10 12:41:04 | 显示全部楼层
贪婪模式与懒惰模式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-3-11 01:24:27 | 显示全部楼层
donkkong 发表于 2017-3-10 16:59
正则表达式错了,原正则:
r'> import re

噢噢,但是我之前那个如果是感叹号的话为什么会有问题呢
我的目的是想让它匹配非感叹号的任意符号,是不是还是有那里有问题
感觉好像是2楼说的贪婪模式的问题...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-3-11 11:51:11 From FishC Mobile | 显示全部楼层
hldh214 发表于 2017-3-10 12:41
贪婪模式与懒惰模式

大哥回复的也很好,但是别人回的多一点,抱歉啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-3-11 15:45:07 | 显示全部楼层
"(?:[^"]+)" 意思就是 双引号 开头,然后中间需要获取的内容不允许是 双引号的所有内容,然后最后双引号结尾,如果需要加上叹号不匹配,那就要写成"(?:[^!"]+)",但叹号旁边的双引号不能不要,如果不要了,就会以贪婪模式一直匹配下去,详情可以搜索贪婪模式,如果硬要去掉双引号,那就是另外一种非贪婪写法了,但不要深究,否则会更乱
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-3-12 09:30:51 From FishC Mobile | 显示全部楼层
donkkong 发表于 2017-3-11 15:45
"(?:[^"]+)" 意思就是 双引号 开头,然后中间需要获取的内容不允许是 双引号的所有内容,然后最后双引号结 ...

好的明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-5 16:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表