Как исключить ключевое слово в скобках в python без использования регулярного выражения?

#python #python-3.x

#python #python-3.x

Вопрос:

У меня есть файл, который я читаю и разделяю по строкам, и я хочу печатать только предложения, в которых есть ключевое слово: ‘Cat’. Однако файл содержит разделы, отформатированные в фигурных скобках, например. {Как только кошка входит в комнату}

Полный текст:
CAT.
{Кошка входит в комнату.} Собака, что ты здесь делаешь?

СОБАКА.
Как это выглядит, я делаю Cat? Я наблюдаю за полицейскими.

CAT.
Я не знал, что ты такой большой фанат! В каком городе это происходит?

СОБАКА.
{Он поворачивает свой стул к коту.} Попробуйте угадать, Кот!

CAT.
Я не знаю! Я просто пытаюсь завязать разговор.

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

 for i in catDog.split('n'):
    if str('Cat')in i:
        print(i)
  

Я ожидаю вывода:
Похоже, что я делаю Cat?
Угадайте, Кот!

Вместо этого я получаю:
[Кошка входит в комнату.]
Похоже, что я делаю Cat?
[Он поворачивает свой стул к Коту.]
Угадай, Кот!

Я не хочу, чтобы кто-то писал код за меня; скорее, укажите мне правильное направление.

Комментарии:

1. Код выполняет то, что вы ему говорите. В каждом из этих предложений слово Cat является этой строкой, поэтому код вернет слово cat. Есть ли еще что-то, к чему мы можем запросить строки?

2. Под «ключевым словом» вы подразумеваете cat все заглавные буквы, или оно также должно начинаться с строки?

3. @EdekiOkoh Правильно, можно ли исключить строки, которые имеют фигурные скобки {} ?

4. @chepner ключевое слово ‘Cat’, конечно, чувствительно к регистру. Я просто переформатировал код для облегчения понимания

5. Если { являются строками, вы можете использовать что-то вроде if «{» не в i. но, не видя фактического представления строк, трудно сказать

Ответ №1:

Учитывая строку, подобную:

  {Cat enters the room.} Dog, what are you doing here?
  

Из вашего вопроса неясно, должна ли (а) эта строка совпадать и (б) если она совпадает, должны ли мы печатать содержимое только за пределами {...} раздела. Предполагая, что да в обоих этих случаях, вы могли бы сделать что-то вроде:

 for i in catDog.split('n'):
    if str('Cat') in i:
        parts = i.split('}', 1)
        print(parts[1 if len(parts) > 1 else 0])
  

Что даст вам:

  Dog, what are you doing here?
What does it look like I'm doing Cat? I'm watching Cops.
 Take a guess Cat!
  

Если вы хотите игнорировать совпадения в начальном {...} разделе, то вы могли бы написать:

 for i in catDog.split('n'):
    parts = i.split('}', 1)
    if str('Cat') in parts[-1]:
        print(parts[1 if len(parts) > 1 else 0])
  

Что дает вам:

 What does it look like I'm doing Cat? I'm watching Cops.
 Take a guess Cat!
  

Ответ №2:

Если вы знаете, какие типы скобок содержат ваши отступы, вы удаляете эту часть строки перед поиском cat.

 if i.startswith('{'):
  i = i[i.index("}")   1:]

if str("Cat") in i:  
  print(i)
  

Комментарии:

1. но невозможно получить точное положение конечной фигурной скобки }

2. index('}') предоставляет это местоположение

3. не могли бы вы объяснить строку: i = i [i.index («}») 1:] Мне трудно понять, как это интерпретировать..

4. Эта строка присваивает подстроку i из местоположения "}" 1 в ее конец обратно переменной i. somestring[startIndex:endIndex] возвращает подстроку, начинающуюся с startIndex и заканчивающуюся на endIndex - 1 . Исключение startIndex означает начать с начала, исключение endIndex означает весь путь до конца. index('}') возвращает индекс первого найденного соответствия.