从列表中提取所有大写单词(Python3)

时间:2015-10-21 18:42:02

标签: regex python-3.x

我正试图从我已经删除的列表中提取所有大写电影: 我正在尝试使用正则表达式来执行此操作

Sub cpypaste()    
    Range("E7").Select    
    SendKeys ("^c"), True    
    Application.Wait (Now + TimeValue("00:00:01"))    
    Range("G7").Select        
    SendKeys ("^v"), True    
End Sub

但是,我的输出会在我的电影结尾附加额外的大写字母

wikis = ["http://www.boxofficemojo.com/daily/chart/"]
for wiki in wikis:
    website = requests.get(wiki)
    soup = BeautifulSoup(website.content, "lxml")
    text = ''.join([element.text for element in soup.body.find_all(lambda tag: tag != 'script', recursive=False)])
    new =  re.sub(r'[^a-zA-Z \n]','',text)
    caps = re.findall('([A-Z]+(?=\s[A-Z]+)(?:\s[A-Z]+)+)', new)

不确定原因,但我知道它与我的正则表达式代码有关:

'BEASTS OF NO NATIONN'
'EVEREST U'
'THE MARTIANF'

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

改为使用它。

caps = re.findall('([A-Z]+(?:(?!\s?[A-Z][a-z])\s?[A-Z])+)', new)

确保下一个单词不仅仅是大写单词。我不能检查这个,所以我不确定它是否会起作用。

编辑:

我道歉,一旦我真正想到它,最后一个没有任何意义。它已被更改为应该工作的

答案 1 :(得分:1)

问题是soup.body.find_all(lambda tag: tag != 'script', recursive=False)只返回3个元素。第三个似乎是正文中的所有文本都删除了所有标签。因此,您的电影名称正好与您的工作室名称相对应,如下所示:THE MARTIANFox。所以抓住那个帽子会给你带来MARTIANF。

此外,只是寻找上限,你会因为非字母字符而错过MISSION:IMPOSSIBLE - ROGUE NATION等内容。

相反怎么样?

wikis = ["http://www.boxofficemojo.com/daily/chart/"]
for wiki in wikis:
    website = requests.get(wiki)
    caps = re.findall("<a href=\"/movies[^>]*>([^<a-z]*)</a>", website.content)

每部电影都在一个指向/电影的链接中,因此这是一种查找它们的简便方法。 <a href=\"movies[^>]*>将匹配开始的锚标记,([^<a-z]*)将匹配锚标记(电影标题)中没有小写字符的字符串,然后</a>将其关闭。