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

Я полный новичок на Python, и я застрял в проблеме с регулярным выражением. Я пытаюсь удалить символ разрыва строки в конце каждой строки в текстовом файле, но только если он следует строчной букве, то есть [az] . Если конец строки заканчивается строчной буквой, я хочу заменить символ разрыва строки / новой строки пробелом.

Это то, что у меня есть до сих пор:

 import re import sys textout = open("output.txt","w") textblock = open(sys.argv[1]).read() textout.write(re.sub("[az]\z","[az] ", textblock, re.MULTILINE) ) textout.close() 

  • Как я могу получить часть регулярного выражения как переменную в python?
  • Python strip XML-теги из документа
  • Сгенерируйте строку, которая соответствует RegEx в Python
  • Регулярные выражения в запросах SQLalchemy?
  • Регулярное выражение для соответствия закрывающим HTML-тегам
  • Как использовать регулярное выражение в lxml xpath?
  • Регулярные выражения Python, найдите домен электронной почты в адресе
  • BeautifulSoup webscraping find_all (): поиск точного соответствия
  • 3 Solutions collect form web for “Регулярное выражение для удаления разрывов строк”

    Пытаться

     re.sub(r"(?<=[az])\r?\n"," ", textblock) 

    \Z совпадает только в конце строки, после последней строки, поэтому это определенно не то, что вам нужно здесь. \z не распознается движком регулярных выражений Python.

    (?<=[az]) является положительным утверждением lookbehind, которое проверяет, является ли символ перед текущей позицией строчным символом ASCII. Только тогда двигатель регулярных выражений будет пытаться сопоставить разрыв строки.

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

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

     import re import sys with open(sys.argv[1]) as ifp: with open("output.txt", "w") as ofp: for line in ifp: if re.search('[az]$',line): ofp.write(line.rstrip("\n\r")+" ") else: ofp.write(line) 

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

     import re import sys with open(sys.argv[1]) as ifp: with open("output.txt", "w") as ofp: for line in ifp: ofp.write(re.sub('(?m)([az])[\r\n]+$','\\1 ',line)) 

    Части этого регулярного выражения:

    • (?m) [включить многострочное совпадение]
    • ([az]) [соответствует одному символу нижнего регистра в качестве первой группы]
    • [\r\n]+ [соответствует одному или нескольким символам возврата каретки или новой строки, чтобы накрыть \n , \r\n и \r ]
    • $ [соответствует концу строки]

    … и если это соответствует строке, строчная буква и окончание строки заменяются на \\1 , что будет буквой нижнего регистра, за которой следует пробел.

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

    ОК. Хотя, лично, я не считаю, что это менее читаемо. Это вопрос вкуса.

    В вашем EDIT:

    • Во-первых, (? M) не требуется, поскольку для строки в ifp: выбирает одну строку за раз, и поэтому в конце строки каждой строки есть только одна строка новой строки

    • Во-вторых, $, поскольку он помещен, не имеет полезности, потому что он всегда будет соответствовать концу строки строки.

    В любом случае, принимая вашу точку зрения, я нашел два способа избежать утверждения lookbehind:

     with open(sys.argv[1]) as ifp: with open("output.txt", "w") as ofp: for line in ifp: ante_newline,lower_last = re.match('(.*?([az])?$)',line).groups() ofp.write(ante_newline+' ' if lower_last else line) 

    а также

     with open(sys.argv[1]) as ifp: with open("output.txt", "w") as ofp: for line in ifp: ofp.write(line.strip('\r\n')+' ' if re.search('[az]$',line) else line) 

    вторая лучше: только одна строка, простое совпадение для тестирования, отсутствие необходимости в группах (), естественно логическая

    EDIT: О, я понимаю, что этот второй код – это просто ваш первый код, переписанный в одной строке, Longair

    Python - лучший язык программирования в мире.