当前位置: 代码迷 >> 综合 >> 使用正则表达式提取电影排名资料(学习心得)
  详细解决方案

使用正则表达式提取电影排名资料(学习心得)

热度:62   发布时间:2024-02-02 06:49:31.0

最近在准备数学建模大赛,其中一题要求用到豆瓣电影的TOP50数据
我的python学习进度刚好学到正则表达式
于是便尝试使用python爬取豆瓣的网页数据

由于只学到txt数据的提取,于是我用了比较原始的方式——复制网页文字到TXT文件,再使用python遍历

需要提取的信息示例:

‘’’ 1肖申克的救赎 肖申克的救赎 / The Shawshank Redemption / 月黑高飞(港) /
刺激1995(台) [可播放] 导演: 弗兰克·德拉邦特 Frank Darabont 主演: 蒂姆·罗宾斯 Tim Robbins
/… 1994 / 美国 / 犯罪 剧情

9.7 2090560人评价 希望让人自由。

2霸王别姬
霸王别姬 / 再见,我的妾 / Farewell My Concubine [可播放] 导演: 陈凯歌 Kaige Chen 主演: 张国荣 Leslie Cheung / 张丰毅 Fengyi Zha… 1993 / 中国大陆 中国香港 / 剧情 爱情 同性

9.6 1550401人评价 风华绝代。

3阿甘正传 阿甘正传 / Forrest Gump / 福雷斯特·冈普 [可播放] 导演: 罗伯特·泽米吉斯 Robert
Zemeckis 主演: 汤姆·汉克斯 Tom Hanks / … 1994 / 美国 / 剧情 爱情

9.5 1579058人评价 一部美国近现代史。

4这个杀手不太冷 这个杀手不太冷 / Léon / 杀手莱昂 / 终极追杀令(台) 导演: 吕克·贝松 Luc Besson 主演:
让·雷诺 Jean Reno / 娜塔莉·波特曼 … 1994 / 法国 美国 / 剧情 动作 犯罪

9.4 1768777人评价 怪蜀黍和小萝莉不得不说的故事。

5泰坦尼克号 泰坦尼克号 / Titanic / 铁达尼号(港 / 台) [可播放] 导演: 詹姆斯·卡梅隆 James Cameron
主演: 莱昂纳多·迪卡普里奥 Leonardo… 1997 / 美国 / 剧情 爱情 灾难

9.4 1532631人评价 失去的才是永恒的。 ‘’’

导演信息提取:

directorRegex = re.compile(r'(导演: )(\w+(?:·\w+)*(?:·\w+)* )(\w+(?:\W\w+)*(?:\W\w+)*)?')

groups[0] 提取了匹配出来的 ‘导演:’
groups[1] 提取了导演的中文名

其中括号的使用是一个比较值得注意的地方

若使用 findall 方法提取,将返回一个groups列表,在 regex 变量中的每两个最外层括号代表一组,匹配出的groups字符串列表分别对应每个括号中匹配的内容,当括号外使用 " ? " 符号时,匹配零次的字符串在列表中表示为 None,返回groups列表的长度仍然与最外层括号数量一致。

关于最外层括号,若想使括号不分组,则在括号内的表达式前加上 ?: 例如表达式:(?:·\w+)* ,在外层括号内若要使用括号,最好也使用不分组括号,以避免出错。

排名数据提取:

rankingRegex = re.compile('(\d{1,2})([\u4e00-\u9fa5]+|[\u4e00-\u9fa5]+[\W\d]{,3}[\u4e00-\u9fa5]+)\\n')

其中 " [\u4e00-\u9fa5]+ " 可提取多个中文字符,同时要注意 [ ] 和 ( ) 的区别,前一个方括号表示包含里面任一元素,可以使用 - 表示从某元素到某元素,后一个圆括号则表示包含里面全部元素才能进行匹配

在匹配换行符时 使用 \n 转义后才能使用,若使用原始字符串则不需要

上面的 rankingRegex 的后半部分比较复杂,是因为有部分影片名字中间夹杂着符号与数字

在使用管道 | 时,例如( | | ),其中 | 与( )之间的所有元素都会被匹配

拍摄国家数据提取:

countryRegex = re.compile(r'''([ ](美国|英国|中国大陆|中国香港|中国台湾|印度|意大利|法国|日本|韩国|黎巴嫩|德国|瑞士|加拿大|新西兰)[ ](美国|英国|中国大陆|中国香港|中国台湾|印度|意大利|法国|日本|韩国|黎巴嫩|德国|瑞士|加拿大|新西兰)?[ ]?(美国|英国|中国大陆|中国香港|中国台湾|印度|意大利|法国|日本|韩国|黎巴嫩|德国|瑞士|加拿大|新西兰)?[ ]?(美国|英国|中国大陆|中国香港|中国台湾|印度|意大利|法国|日本|韩国|黎巴嫩|德国|瑞士|加拿大|新西兰)?)''',re.VERBOSE)

此处使用了原始字符串 + 多行字符串 + re.VERBOSE 方法

添加 re.VERBOSE 参数后,regex变量中所有空白字符将被忽略,如:空格,换行符等等,如果需要匹配空格字符,可以使用方括号 [ ]

上式包含了所有在top50上出现的国家,最多四个,且提取出来后可以根据需求分组:国家1,国家2等

剩余的信息都可以使用同样方法提取,此处不再多讲

部分提取结果: 在这里插入图片描述
以上便是该文章全部内容
能力有限,若有更优的方法可以或者不合理之处尽管指出