Python 从re.findall(regex,text)更改为nltk.text.findall(regex)

Python 从re.findall(regex,text)更改为nltk.text.findall(regex),python,regex,nltk,Python,Regex,Nltk,使用Python和NLTK,我编写了一个正则表达式来查找文本体中以大写字母开头但不在句首的单词 最初我使用它的方式如下: [w for w in text if re.findall(r'(?<!\.\s)\b[A-Z][a-z]\b',w)] 然而这似乎不起作用,它仍然返回句子开头的单词。 所以我想我应该尝试使用text.findall()函数。 我运行了以下命令,它按照要求返回了所有大写字母的单词 >>> text.findall("<[A-Z][a-z]{3

使用Python和NLTK,我编写了一个正则表达式来查找文本体中以大写字母开头但不在句首的单词

最初我使用它的方式如下:

[w for w in text if re.findall(r'(?<!\.\s)\b[A-Z][a-z]\b',w)]
然而这似乎不起作用,它仍然返回句子开头的单词。 所以我想我应该尝试使用text.findall()函数。 我运行了以下命令,它按照要求返回了所有大写字母的单词

>>> text.findall("<[A-Z][a-z]{3,}>")
>>text.findall(“”)
我的问题是,我不知道如何将正则表达式的第一位转换为第二个函数所需的格式,如果我这样做了,它是否会工作,或者我是否采取了完全错误的方法


谢谢。

我不确定你对第一个列表的理解是什么:你在每个单词上使用findall,而不是文本本身

使用树库语料库最简单的方法是:

import itertools
non_starting_words = list(itertools.chain(*[s[1:] for s in treebank.sents()]))
uppercase_words = [w for w in non_starting_words if w[0].isupper()]
也许这就是你想用“concat”函数做的,但它只是得到了一个所有单词的列表——它没有删除每个句子的第一个。如果您确实想连接列表列表,一种更好的方法是我上面所做的列表(itertools.chain(*lists))

ETA:鉴于您必须使用令牌列表,最好的解决方案是不使用正则表达式,而是:

punctuation_marks = ".!?"
first_word = True
uppercase_words = []

for w in text:
    if not first_word and re.match("[A-Z][a-z]*$", w):
        uppercase_words.append(w)
    first_word = w in punctuation_marks

print uppercase_words

是的,我意识到我对第一行做了什么,但我把它包括在内,因为正则表达式按照我想要的方式工作。不幸的是,提供了concat函数和text=nltk.text(tbsents)部分,我需要在“text”变量中查找专有名词。我没有意识到这是一个赋值。你确定你的第一行行行吗?当我精确地复制你的代码时,我得到['He','Mr','He','He','He','So','Mr','Mr','Mr','In']作为列表。我就是这样测试它的:>>>re.findall(r'(?在那个测试中,你将它应用到整个句子中。在你问题的代码中,你将它应用到每个单词中-有巨大的差异。这就是我意识到的,所以我想我会使用第二种方法来处理text.findall(),但这是否也一样?
punctuation_marks = ".!?"
first_word = True
uppercase_words = []

for w in text:
    if not first_word and re.match("[A-Z][a-z]*$", w):
        uppercase_words.append(w)
    first_word = w in punctuation_marks

print uppercase_words