Regex, чтобы найти имена в каждом предложении, используя python - PullRequest
0 голосов
/ 28 апреля 2020

Hii Я новичок в регулярных выражениях и застрял в этом вопросе.

Q- Определите все слова, которые выглядят как имена в предложении. Другими словами, те, которые написаны с заглавной буквы, но не являются первым словом в предложении.

предложение = "Это не имя, но Гарри. Так же, как и Сьюзи. Сэм следует пропустить, так как это первое слово в предложении. "

Вот что я сделал ... но не получил никакого вывода (исключая текст с начала, пока я не получу любое заглавное слово, которое является именем)

    p = re.compile(r'[^A-Z]\w+[A-Z]\w+')
    m = p.finditer(sentence)
    for m in m:
        print(m)

Ответы [ 4 ]

1 голос
/ 28 апреля 2020

Предполагая, что всегда есть только один пробел после точки перед началом другого предложения, вы можете использовать отрицательный шаблон lookbehind для исключения имен, которым предшествует точка и пробел, и другой отрицательный шаблон lookbehind для исключения начала строки. Также используйте \b, чтобы обеспечить совпадение заглавной буквы на границе слова:

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

Возвращает:

['Harry', 'Susy']
1 голос
/ 28 апреля 2020

Вы используете положительный взгляд назад, чтобы найти шаблон с заглавными буквами для слова, которое не находится в начале предложения.

Примерно так:

>>> 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']
0 голосов
/ 28 апреля 2020

Imo лучше всего сделать с nltk:

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']
0 голосов
/ 28 апреля 2020

Вы перезаписываете переменную m. Попробуйте это:

p = re.compile(r'[^A-Z]\w+[A-Z]\w+')
for m in p.finditer(sentence):
    print(m)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...