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"]
Я не знаю, правильно ли концептуально использовать append(), но, похоже, это работает для получения результата, который я там получил. Изменится ли что-нибудь, если я буду использовать extend()? В любом случае, я думаю, что исчезновение (?:[A-Z]|l[oa]s|la|[eé]l) вещи происходит во время re.split()
Append добавляет элемент как элемент. Например. [1, 2, 3].append([4, 5]) = [1, 2, 3, [4, 5]]. Extend добавляет элементы контейнера в список. Например. [1, 2, 3].append([4, 5]) = [1, 2, 3, 4, 5].
Ммм... Таким образом, я мог бы не прибегать к вспомогательным спискам, чтобы добавить их позже aux_list = aux_list + aux_frases_list ? И все равно получить тот же результат
Не слишком много читали в вашем коде, почему бы не попробовать?
@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í"]].
Если я использую 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()
Понятно, я бы использовал append вместо +.
Проблема с этим в регулярном выражении
В списке предложений всего 1 предложение. Вы ожидали, что все получится с первого раза?
@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"
Вы теряете разделенные символы в результирующих массивах. Разделенное регулярное выражение потребляет сплиттеры. С какой стороны вы хотите держать его, слева или справа? (?<=) или (?=) Должно быть довольно легко.
Я предполагаю, что регулярное выражение сплиттера должно быть таким:
(?:[,.;]?\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 (и, необязательно) на границах сохраняя перспективную группу уточняющего текста, не потребляя их. И обрезка начальных пробелов в качестве бонуса.
Используете ли вы ?= вместо ?:, чтобы указать, что шаблон будет или не будет использовать последовательность, которой он соответствует?
Да (?= ...) смотрит по дорожке, не заходя туда.
Вы хотели использовать extend() вместо append()?