Почему метод поиска в регулярных выражениях Python не возвращает правильно сопоставленный объект? - PullRequest
0 голосов
/ 29 сентября 2018

Я задаю практический вопрос по курсу Regex:

Как бы вы написали регулярное выражение, соответствующее предложению, где первое слово - это Алиса, Боб или Кэрол;второе слово - «ест», «домашние животные» или «броски»;третье слово - яблоки, кошки или бейсбольные мячи;а предложение заканчивается точкой?Это регулярное выражение должно быть без учета регистра.Оно должно соответствовать следующему:

  • Алиса ест яблоки.
  • Боб питомцы кошек.
  • Кэрол бросает бейсбольные мячи.
  • Алиса бросает яблоки.
  • BOB EATS CATS.

Мой код выглядит следующим образом:

regex=re.compile(r'Alice|Bob|Carol\seats|pets|throws\sapples\.|cats\.|baseballs\.',re.IGNORECASE)
mo=regex.search(str)
ma=mo.group()

Когда я передаю str ='BOB EATS CATS.' или 'Alice throws Apples.', mo.group() возвращает только 'Bob' или 'Alice' соответственно, но я ожидал, что он вернет все предложение.

Когда я передаю str='Carol throws baseballs.', mo.group() возвращает 'baseballs.', что является последним совпадением.

Я не понимаю, почему:

  • Для первых двух примеров str, которые я передал, он вернул первое совпадение ('Bob' или 'Alice'), в то время как 3-й пример str, который я передал, вернул последнее совпадение ('baseball')?

  • Во всех трех строковых примерах я не уверен, почему mo.group() не возвращает все предложение как совпадение.то есть я ожидал 'Carol throws baseballs.' как вывод от mo.group()

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Вы должны указать своему регулярному выражению, чтобы каким-то образом сгруппировать списки опций, или он, естественно, подумает, что это один гигантский список с некоторыми элементами, содержащими пробелы.Самый простой способ - использовать группы захвата для каждого слова:

regex=re.compile(r'(Alice|Bob|Carol)\s+(eats|pets|throws)\s+(apples|cats|baseballs)\.', re.IGNORECASE)

Трейлинг не должен быть частью опции.Если по какой-то причине вы не хотите использовать группы захвата (это не повлияет на то, как будет выполнено совпадение), вы можете использовать группы без захвата.Замените (...) на (?:...).

Ваше исходное регулярное выражение интерпретировалось как следующий набор параметров:

  • Alice
  • Bob
  • Carol\seats
  • pets
  • throws\sapples.
  • cats.
  • baseballs.

Пробелы не разделяют магически опции.Надеюсь, вы поймете, почему ни один из элементов Carol throws baseballs., кроме baseballs., не присутствует в этом списке.Что-то вроде Carol eats baseballs. будет соответствовать Carol eats.

0 голосов
/ 29 сентября 2018

вы должны сгруппировать все слова

ваш ре должен выглядеть так:

regex = r'(?:Alice|Bob|Carol)\s(?:eats|pets|throws)\s(?:apples|cats|baseballs)\.'

обратите внимание, что я использую (? :) и не (), потому что группировка только для логическогоцель

...