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

import re

sentences_list = ["El coche ((VERB) es) rojo, la bicicleta ((VERB)está) allí; el monopatín ((VERB)ha sido pintado) de color rojo, y el camión también ((VERB)funciona) con cargas pesadas", "El árbol ((VERB es)) grande, las hojas ((VERB)son) doradas y ((VERB)son) secas, los juegos del parque ((VERB)estan) algo oxidados y ((VERB)es) peligroso subirse a ellos"]

aux_list = []
for i_input_text in sentences_list:

    #separator_symbols = r'(?:(?:,|;|\.|\s+)\s*y\s+|,\s*|;\s*)'
    separator_symbols = r'(?:(?:,|;|\.|)\s*y\s+|,\s*|;\s*)(?:[A-Z]|l[oa]s|la|[eé]l)'
    
    pattern = r"\(\(VERB\)\s*\w+(?:\s+\w+)*\)"
    
    # Separar la frase usando separator_symbols
    frases = re.split(separator_symbols, i_input_text)
    
    aux_frases_list = []
    # Buscar el patrón en cada frase separada
    for i_frase in frases:
        verbos = re.findall(pattern, i_frase)
        if verbos:
            #print(f"Frase: {i_frase}")
            #print(f"Verbos encontrados: {verbos}")
            aux_frases_list.append(i_frase)
    aux_list = aux_list + aux_frases_list
    
sentences_list = aux_list
print(sentences_list)

Как сделать, чтобы эти разделения без того, что обозначено (?:[A-Z]|l[oa]s|la|[eé]l), были удалены из следующей строки после разделения?

Используя этот код, я получаю неправильный вывод:

['El coche ((VERB) es) rojo', ' bicicleta ((VERB)está) allí', ' monopatín ((VERB)ha sido pintado) de color rojo', ' camión también ((VERB)funciona) con cargas pesadas', ' hojas ((VERB)son) doradas y ((VERB)son) secas', ' juegos del parque ((VERB)estan) algo oxidados y ((VERB)es) peligroso subirse a ellos']

Любопытно, что предложение "El árbol ((VERB es)) grande" прямо исчезло из итогового списка, хотя должно быть

Вместо этого вы должны получить этот список строк:

["El coche ((VERB) es) rojo", "la bicicleta ((VERB)está) allí", "el monopatín ((VERB)ha sido pintado) de color rojo", "el camión también ((VERB)funciona) con cargas pesadas", "El árbol ((VERB es)) grande", "las hojas ((VERB)son) doradas y ((VERB)son) secas", "los juegos del parque ((VERB)estan) algo oxidados y ((VERB)es) peligroso subirse a ellos"]

Вы хотели использовать extend() вместо append()?

B Remmelzwaal 13.02.2023 22:25

Я не знаю, правильно ли концептуально использовать append(), но, похоже, это работает для получения результата, который я там получил. Изменится ли что-нибудь, если я буду использовать extend()? В любом случае, я думаю, что исчезновение (?:[A-Z]|l[oa]s|la|[eé]l) вещи происходит во время re.split()

Matt095 13.02.2023 22:30

Append добавляет элемент как элемент. Например. [1, 2, 3].append([4, 5]) = [1, 2, 3, [4, 5]]. Extend добавляет элементы контейнера в список. Например. [1, 2, 3].append([4, 5]) = [1, 2, 3, 4, 5].

B Remmelzwaal 13.02.2023 22:35

Ммм... Таким образом, я мог бы не прибегать к вспомогательным спискам, чтобы добавить их позже aux_list = aux_list + aux_frases_list ? И все равно получить тот же результат

Matt095 13.02.2023 22:37

Не слишком много читали в вашем коде, почему бы не попробовать?

B Remmelzwaal 13.02.2023 22:39

@BRemmelzwaal Это способ сокращения кода, но даже в этом случае регулярное выражение отвечает за то, что вместо того, чтобы разбить эту строку "El coche ((VERB) es) rojo, la bicicleta ((VERB)está) allí" на этот список строк ["El coche ((VERB) es) rojo", "la bicicleta ((VERB)está) allí"] , оно разбивает ее неправильно вот так [["El coche ((VERB) es) rojo", " bicicleta ((VERB)está) allí"]].

Matt095 13.02.2023 22:44

Если я использую aux_frases_list.extend(i_frase), я получаю этот вывод даже хуже, чем предыдущий ['E', 'l', ' ', 'c', 'o', 'c', 'h', 'e', ' ', '(', '(', 'V', 'E', 'R', 'B', ')', ' ', 'e', 's', ')', ' ', 'r', 'o', 'j', 'o', ' ', 'b', 'i', 'c', 'i', 'c', 'l', 'e', 't', 'a', ..... Вот почему я использовал append()

Matt095 13.02.2023 22:47

Понятно, я бы использовал append вместо +.

B Remmelzwaal 13.02.2023 23:01

Проблема с этим в регулярном выражении

Matt095 13.02.2023 23:22

В списке предложений всего 1 предложение. Вы ожидали, что все получится с первого раза?

sln 14.02.2023 00:37

@sln В переменной sentences_list есть 2 строки (или 2 предложения), а это "El coche ((VERB) es) rojo, la bicicleta ((VERB)está) allí; el monopatín ((VERB)ha sido pintado) de color rojo, y el camión también ((VERB)funciona) con cargas pesadas" и "El árbol ((VERB es)) grande, las hojas ((VERB)son) doradas y ((VERB)son) secas, los juegos del parque ((VERB)estan) algo oxidados y ((VERB)es) peligroso subirse a ellos"

Matt095 14.02.2023 00:48

Вы теряете разделенные символы в результирующих массивах. Разделенное регулярное выражение потребляет сплиттеры. С какой стороны вы хотите держать его, слева или справа? (?<=) или (?=) Должно быть довольно легко.

sln 14.02.2023 01:09
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Отказ от ответственности: Эта статья предназначена только для демонстрации и не должна использоваться в качестве инвестиционного совета.
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Потяните за рычаг выброса энергососущих проектов
Потяните за рычаг выброса энергососущих проектов
На этой неделе моя команда отменила проект, над которым я работал. Неделя усилий пошла насмарку.
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
0
12
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

(?:[,.;]?\s*y\s+|[,;]\s*)(?=[A-Z]|l(?:[ao]s|a)|[eé]l)

Https://regex101.com/r/jpWfvq/1

 (?: [,.;]? \s* y \s+ | [,;] \s* )   # consumed
 (?=                                 # not consumed
    [A-Z] 
  | l
    (?: [ao] s | a )
  | [eé] l
 )

Который разбивается на знаки препинания и y (и, необязательно) на границах сохраняя перспективную группу уточняющего текста, не потребляя их. И обрезка начальных пробелов в качестве бонуса.

Используете ли вы ?= вместо ?:, чтобы указать, что шаблон будет или не будет использовать последовательность, которой он соответствует?

Matt095 14.02.2023 02:14

Да (?= ...) смотрит по дорожке, не заходя туда.

sln 14.02.2023 21:27

Другие вопросы по теме