Python / Регулярное выражение, добавляющее новую строку с группой захвата по всему тексту, удаляет и переставляет текст

#python #regex #lint

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

Вопрос:

Итак, проблема оказалась сильно отличной от того, что я думал, но публикую ее для потомков.

Целью регулярного выражения является сокращение кода CPP, поэтому для этого конкретного шаблона я хотел свернуть все, что не сигнализировало о том, что новая строка (';', '{', '}') будет свернута.

Шаблон таков: r « (^;{}])[rn]s* »

  1. Группа захвата 1: найдите символ за пределами допустимого набора, за которым следует:
  2. Один из символов новой строки
  3. Устраните любые табуляции или пробелы для форматирования в начале следующей строки

Это вызвало у меня некоторые интересные головные боли, но в основном это привело бы к удалению целых строк кода и изменению порядка оставшихся строк кода. Проблема заключалась в том, что Windows использует ‘ r n’ как разрыв строки, а не только один.

Чтобы исправить это, вы можете либо 1) преждевременно удалить код из-за лишних разрывов строк, либо 2) изменить второй раздел кода для жадного поиска любого количества новых строк. У меня были смешанные результаты только с 2, поэтому я рекомендую использовать оба.

Неработающий код

 file = open("examplecode2.txt")
self.plain_text = file.read()
file.close()
# this is preprocessing, not related to the problem
self.modified_text = re.sub(r"(s) [rn]", r"rn", self.plain_text)
self.modified_text = re.sub(r"([^;{}])[nr]s*", r"1", self.modified_text)
 

Исправлен код

 file = open("examplecode2.txt")
self.plain_text = file.read()
file.close()
# this is preprocessing, not related to the problem
self.modified_text = re.sub(r"(s) [rn]", r"rn", self.plain_text)
# remove Windows' redundant line breaks
self.modified_text = re.sub(r"rn", r"n", self.modified_text)
# add a greedy catch to the sub
self.modified_text = re.sub(r"([^;{}])[nr] s*", r"1", self.modified_text)
 

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

Ответ №1:

(Цитирую вопрос, чтобы упростить его)

Чтобы исправить это, вы можете либо 1) преждевременно удалить код из-за лишних разрывов строк, либо 2) изменить второй раздел кода для жадного поиска любого количества новых строк. У меня были смешанные результаты только с 2, поэтому я рекомендую использовать оба.

Исправлен код

 file = open("examplecode2.txt")
self.plain_text = file.read()
file.close()
# this is preprocessing, not related to the problem
self.modified_text = re.sub(r"(s) [rn]", r"rn", self.plain_text)
# remove Windows' redundant line breaks
self.modified_text = re.sub(r"rn", r"n", self.modified_text)
# add a greedy catch to the sub
self.modified_text = re.sub(r"([^;{}])[nr] s*", r"1", self.modified_text)