Я хочу разделить строку, если она удовлетворяет некоторым условиям в python

#python #regex #string #split

#python #регулярное выражение #строка #разделить

Вопрос:

 my_str = 'According to the teacher, "He never believed what I said. He ran away." And I think he did indeed. I tried to find him, but I could not.'
  

Результат должен быть:

 ['According to the teacher, "He never believed what I said. He ran away." And I think he did indeed.', 'I tried to find him, but I could not.']
  

В этой строке я хочу разделить ее на .(точка)
Однако я не хочу разделять ее, если .(точка) находится в » » (цитата)

Как я могу это сделать с помощью re.split() ?

Ответ №1:

Рассмотрите возможность использования .findall , с:

 (?:[^."] "[^"] ")*[^."] .
  

https://regex101.com/r/d400Ut/1

  • (?:[^."] "[^"] ")* — Повторите 0 или более раз:
    • [^."] Не- ". символы, за которыми следует
    • "[^"] " — Символы внутри кавычек
  • [^."] . — Сопоставьте не ." символы, за которыми следует точка
 matches = re.findall(r'(?:[^."] "[^"] ")*[^."] .', my_str)
  

Ответ №2:

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

 def custom_split_string(s: str) -> List[str]:
    output = []
    in_quote = False
    word = []
    for ch in s:
        word.append(ch)
        if ch == "." and not in_quote:
            output.append(''.join(word))
            word.clear()
        elif ch == '"':
            in_quote = not in_quote  # assume no nested quotes
    return output

my_str = 'According to the teacher, "He never believed what I said. He ran away." And I think he did indeed. I tried to find him, but I could not.'

expected_output = ['According to the teacher, "He never believed what I said. He ran away." And I think he did indeed.', ' I tried to find him, but I could not.']

assert custom_split_string(my_str) == expected_output