Как сопоставить слово до конца предложения? - PullRequest
2 голосов
/ 29 апреля 2019

Я бы хотел взять все предложение после слова "is" с помощью python regex python.

Мой код:

s = '''Robert is an English actor, model and musician.
He started his film career by playing Cedric Diggory in Harry Potter.'''
r = re.findall(r'(?:is) (.*)',s)
print(r)

Я ожидаю, что результат будет:

'an English actor, model and musician'

Но фактический результат:

['an English actor, model and musician','film career by playing Cedric Diggory in Harry Potter']

Ответы [ 4 ]

1 голос
/ 29 апреля 2019

Поскольку вы хотите получить только от is до конца предложения, этот RegEx будет работать:

\bis\s+(.+?)\.

, который необходимо использовать с флагом s, чтобы . также соответствовал символам новой строки, если предложение разбито на несколько строк. Я использую + квантификатор с ., так как .* сделает соответствие всего регулярного выражения даже ничем между is и ., что не имеет смысла для предложения.

enter image description here

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

Обратите внимание, что такой простой подход не сработает, если в предложении есть такие слова, как Mrs. (и есть много фраз, содержащих ., которые могут принадлежать предложению).

Разбор естественного языка очень сложен. Если у вас есть что-нибудь более сложное, чем простой, четко определенный и предсказуемый текст, тогда вам следует обратиться к выделенной библиотеке. Быстрый поиск показывает, например, комплексные библиотеки NLTK и spaCy .


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

(\bis\b)([\s\S]*)

enter image description here

Подробнее смотрите на связанной странице. Комментарии

  • Он создает две группы захвата, где вашей целевой выходной информацией является вторая группа, и вы можете назвать ее, используя $ 2 .

  • Первая группа создает границу слова вокруг вашего единственного экземпляра , равного .

  • Вы можете экранировать мета-символы любого языка, используя \ .

1 голос
/ 29 апреля 2019

Вам необходимо использовать границы слов вокруг is, чтобы только is соответствовало целому слову, а не частично другому слову, как оно совпадает с his (что не предназначено), и используйте это регулярное выражение,

\bis\s+([^.]*)

Без границ слов, даже his соответствует и дает вам второе предложение, которое вам не нужно.

Regex Demo

Попробуйте этот модифицированный код Python,

import re

s = '''Robert is an English actor, model and musician.
He started his film career by playing Cedric Diggory in Harry Potter.'''
r = re.findall(r'\bis\s+([^.]*)',s)
print(r)

Только для печати,

['an English actor, model and musician']
0 голосов
/ 29 апреля 2019

Это приводит к тому, что .* greeady и соответствует всем остальным, если может (и может).

Поскольку у вас есть новое разделение линий, вы можете использовать его для своих нужд. Используя регулярное выражение только для этой строки, вы можете сделать это, используя Positive Lookbehind (?<=is). будет соответствовать, но не входит в результаты

s = '''Robert is an English actor, model and musician.
He started his film career by playing Cedric Diggory in Harry Potter.'''
r = re.findall(r'(?<=is).*\n',s)
print(r)
[' an English actor, model and musician.\n']
0 голосов
/ 29 апреля 2019

Может быть проще использовать partition():

splice = s.partition("is")[2]  # an English actor, model and musician. He started his film career by playing Cedric Diggory in Harry Potter.

, затем split():

final = splice.split('.')[0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...