Почему мой код не работает? найти слово перед матчем - PullRequest
1 голос
/ 15 октября 2019
s = 'A boy is playing and he is wearing shirt.'

Мое регулярное выражение ((?:\S+\s+)\bis\b)

Мой вывод: ['boy is' ,'he is']

Ожидаемый результат: ['boy','he']

Ответы [ 3 ]

4 голосов
/ 15 октября 2019

Вы можете немного реорганизовать свою группу захвата, чтобы сохранить is слово вне группы и использовать re.findall:

>>> s = 'A boy is playing and he is wearing shirt.'
>>> re.findall(r'(\S+)\s+is\b', s)
['boy', 'he']

findall возвращает только захваченную группу, если она есть в вашем регулярном выражении.

Также обратите внимание, что нет необходимости использовать \b (граница слова) после сопоставления пробелов.

3 голосов
/ 15 октября 2019

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

\S+(?=\s+is\b)

Демонстрация по регулярному выражению regex101

В python

import re

s = 'A boy is playing and he is wearing shirt.'
print(re.findall(r'\S+(?=\s+is\b)', s))

Вывод:

['boy', 'he']
1 голос
/ 15 октября 2019

Решение

Чтобы сохранить решение максимально близким к тому, что вы получили ранее, вы можете replace 'is' с '', а затем убрать все оставшиеся пробелы, используя понимание списка в re.findall результат.

import re

s = 'A boy is playing and he is wearing shirt.'
[x.replace('is','').strip() for x in re.findall('\s*([a-zA-Z+]*\s+is)', s)]

Выход :

['boy', 'he']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...