Regex使用python查找每个句子中的名称

Regex使用python查找每个句子中的名称,python,regex,Python,Regex,嗨,我对regex不熟悉,一直在问这个问题 识别句子中所有看起来像名字的单词。换句话说,那些大写但不是句子中第一个单词的词 句子=“这不是名字,但哈利是。苏西也是。山姆应该被忽略,因为它是句子中的第一个单词。” 以下是我所做的…但没有得到任何输出(从开始到得到任何大写字母单词,即名称,不包括文本) 您正在覆盖m变量。试试这个: p=re.compile(r'[^A-Z]\w+[A-Z]\w+] 对于p.finditer中的m(句子): 打印(m) 假设在另一个句子开始之前,一个点后面总是只有一个

嗨,我对regex不熟悉,一直在问这个问题

识别句子中所有看起来像名字的单词。换句话说,那些大写但不是句子中第一个单词的词

句子=“这不是名字,但哈利是。苏西也是。山姆应该被忽略,因为它是句子中的第一个单词。”

以下是我所做的…但没有得到任何输出(从开始到得到任何大写字母单词,即名称,不包括文本)


您正在覆盖
m
变量。试试这个:

p=re.compile(r'[^A-Z]\w+[A-Z]\w+]
对于p.finditer中的m(句子):
打印(m)

假设在另一个句子开始之前,一个点后面总是只有一个空格,您可以使用负查找模式排除前面有点和空格的名称,并使用另一个负查找模式排除字符串开头。还可以使用
\b
确保大写字母与单词边界匹配:

re.findall(r'(?<!\. )(?<!^)\b[A-Z]\w*', sentence)

您可以使用正向查找来查找不在句首的单词的大小写模式

像这样:

>>> sentence = "This is not a name, but Harry is. So is Susy. Sam should be missed as it's the first word in the sentence."
>>> re.findall(r'(?<=[a-z,][ ])([A-Z][a-z]*)', sentence)
['Harry', 'Susy']
>>句子=“这不是名字,但哈利是。苏西也是。山姆应该被忽略,因为它是句子中的第一个单词。”
>>>关于findall(r’(?Imo),最好使用:

或者-如果你对理解感兴趣:

names = [word
         for sent in sent_tokenize(sentence)
         for word in word_tokenize(sent)[1:]
         if word[0].isupper()]
这将产生

['Harry', 'Susy']

不确定“this”的确切含义,但我注意到我需要添加
\b
。在示例语句中,this is matched(这也是匹配的)一词仍然不明白您的意思。您能查看演示并指出匹配的内容吗?
from nltk import sent_tokenize, word_tokenize

sentence = "This is not a name, but Harry is. So is Susy. Sam should be missed as it's the first word in the sentence."

for sent in sent_tokenize(sentence):
    words = word_tokenize(sent)
    possible_names = [word for word in words[1:] if word[0].isupper()]
    print(possible_names)
names = [word
         for sent in sent_tokenize(sentence)
         for word in word_tokenize(sent)[1:]
         if word[0].isupper()]
['Harry', 'Susy']