设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
楼主: crossin先生
打印 上一主题 下一主题

【Python 第55课】 正则表达式(1)

[复制链接]

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

11#
发表于 2017-1-14 14:46:07 |只看该作者
l0ve1o24 发表于 2017-1-13 14:36
在前面那个例子里,“\bhi\b”匹配不到任何结果。但“\bhi”的话就可以匹配到1个“hi”,出自“his”。用这 ...

没明白你的意思,你想匹配哪一个?
\bhi\b 是匹配单词hi,不包括其他词中间的,这个没错。\bhi 就是匹配单词开头的 hi
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

96

积分

注册会员

Rank: 2

12#
发表于 2017-1-14 20:36:40 |只看该作者
crossin先生 发表于 2017-1-14 14:46
没明白你的意思,你想匹配哪一个?
\bhi\b 是匹配单词hi,不包括其他词中间的,这个没错。\bhi 就是匹配 ...

没有,你前面不是提了个问题吗?我看没同学解答,看了后面的课,差不多知道了
回复

使用道具 举报

0

主题

0

好友

28

积分

新手上路

Rank: 1

13#
发表于 2017-8-11 15:32:04 |只看该作者
有个问题,python3里,直接用r‘hi’,出来的就是\bhi\b的效果。。。就是只输出hi,不输出包括hi的单词。。。这个应该怎么输出包括hi的单词
  1. import re
  2. text = 'Hi,I am Shirly Hilton.I am his wife.'
  3. m = re.findall(r'hi',text)
  4. print(m)
复制代码
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

14#
发表于 2017-8-11 23:49:31 |只看该作者
tanlongfei 发表于 2017-8-11 15:32
有个问题,python3里,直接用r‘hi’,出来的就是\bhi\b的效果。。。就是只输出hi,不输出包括hi的单词。。 ...

和py3无关,hi就是匹配hi呀,包含的单词,那你前后得加上通配符(往后面两课继续看下去)
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

28

积分

新手上路

Rank: 1

15#
发表于 2017-8-17 21:10:52 |只看该作者
嗯嗯,谢谢crossin先生,这两天没上,之前那个问题自己看了后面的明白了。
又有了新的问题,我现在在做练习题,抓取豆瓣推荐电影的练习题,然后代码已经写完,这个网址一共十页。非常奇怪的是,自动循环运行前八页的时候,都能顺利进行,运行第九页的时候,告诉我list长度出了问题,我然后自己看了下出问题的地方,长度正确,不知道问题出在了哪,麻烦crossin先生或者哪位大神给看下。
  1. #https://movie.douban.com/top250?start=0&filter=
  2. #上面这个网址以start跳动25翻页
  3. import urllib.request
  4. import re
  5. import time

  6. #这是抓取的函数
  7. def zhua(mum):
  8.     #抓取电影,之后把这部分写成函数形式
  9.     url = 'https://movie.douban.com/top250?start=%d&filter='%num
  10.     web = urllib.request.urlopen(url).read().decode('UTF-8')
  11.     content = str(web)
  12.     #电影名
  13.     titles = re.findall(r'<span class="title">\w+',content)
  14.     titles = [i[20:] for i in titles]  #此句为去除匹配电影名时的特定词
  15.     #导演
  16.     daoyan = re.findall(r'导演:\s[^&]+',content)
  17.     #主演
  18.     actors = re.findall(r'主[^<]+',content)
  19.     #上映日期
  20.     playtime = re.findall(r'\s{29}[0-9]+',content)
  21.     playtime = [i[29:] for i in playtime]
  22.     #产地和剧情
  23.     candj = re.findall(r'&nbsp;/&nbsp;.*&nbsp;/&nbsp;.*',content)
  24.     chandi = []
  25.     juqing = []
  26.     for i in range(0,25):
  27.         chandi.append(candj[i].split('&nbsp;/&nbsp;')[1])
  28.         juqing.append(candj[i].split('&nbsp;/&nbsp;')[1])
  29.     #一句话影评
  30.     yp = re.findall(r'<span class="inq">[^<]+',content)
  31.     yp = [i[18:] for i in yp]
  32.     outdata = []
  33.     for i in range(0,25):
  34.         outdata.append('电影名 '+titles[i]+'\n'\
  35.                        +daoyan[i]+'\n'+actors[i]+'\n'\
  36.                        +'上映日期 '+playtime[i]+'\n'\
  37.                        +'产地/语言 '+chandi[i]+'\n'\
  38.                        +juqing[i]+'\n'\
  39.                        +'影评 '+yp[i]+'\n\n')
  40.     out = open('out.txt','a',encoding='utf-8')
  41.     for i in outdata:
  42.         out.write(i)
  43.     out.close()


  44. #接下来是设计循环运行十次
  45. for i in range(0,10):
  46.     print(i)
  47.     num = i*25
  48.     zhua(num)
复制代码
出现的问题是:
  1. Traceback (most recent call last):
  2.   File "C:\Users\T\Desktop\913抓取豆瓣电影.py", line 51, in <module>
  3.     zhua(num)
  4.   File "C:\Users\T\Desktop\913抓取豆瓣电影.py", line 40, in zhua
  5.     +'影评 '+yp[i]+'\n\n')
  6. IndexError: list index out of range
  7. >>>
复制代码
谢谢
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

16#
发表于 2017-8-17 23:06:43 |只看该作者
tanlongfei 发表于 2017-8-17 21:10
嗯嗯,谢谢crossin先生,这两天没上,之前那个问题自己看了后面的明白了。
又有了新的问题,我现在在做练习 ...

这个从代码看不出来。你得自己调试,把 yp 输出出来看看是什么
有些电影的数据是没有的
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

28

积分

新手上路

Rank: 1

17#
发表于 2017-8-18 11:11:03 |只看该作者
crossin先生 发表于 2017-8-17 23:06
这个从代码看不出来。你得自己调试,把 yp 输出出来看看是什么
有些电影的数据是没有的 ...

嗯,先谢谢你那么晚还回复。。。
我那个是调试以后的,yp是当页25部电影的影评。正常来说,yp应该是一个长度为25的list,事实上,我在单独运行那一页的数据后,也是长度为25的list。然后就不知道为什么老是出错。
还有个需要注意的是,我觉得问题不在yp这,因为如果我把yp从函数的循环里删除了,理论上也是可以正常运行的,就是每个电影没有影评罢了,然后在那页还是会出错,出错原因还是一样的,只是出错的地方成了juqing这里,也是反馈说out of range。。。
然后把juqing也去了,反馈上一个chandi同样的问题。。。。
不知道你碰到过这样的情况吗,或者你知道该怎么解决吗
回复

使用道具 举报

0

主题

0

好友

28

积分

新手上路

Rank: 1

18#
发表于 2017-8-18 11:22:58 |只看该作者
crossin先生 发表于 2017-8-17 23:06
这个从代码看不出来。你得自己调试,把 yp 输出出来看看是什么
有些电影的数据是没有的 ...

crossin先生,我找到问题了,是有个list不是25长度,但是不是yp。原来分行写的语句不管哪行出了问题都显示最后一行出问题。。。。
谢谢你啦,打扰了
回复

使用道具 举报

1

主题

0

好友

80

积分

注册会员

Rank: 2

19#
发表于 2017-8-25 09:21:31 |只看该作者
本帖最后由 blueheart 于 2017-8-25 09:23 编辑

请问Crossin先生为什么print  "\bhi"会打印出乱码出来的? re1.png

回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

20#
发表于 2017-8-25 09:32:55 |只看该作者
blueheart 发表于 2017-8-25 09:21
请问Crossin先生为什么print  "\bhi"会打印出乱码出来的?

\b 是有特殊含义的字符,被转义了,所以要加 r
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-24 08:17 , Processed in 0.017394 second(s), 22 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部