Python 删除字符串中重复的换行符

Python 删除字符串中重复的换行符,python,regex,line-endings,Python,Regex,Line Endings,我有一些文件可以使用\r、\n或\r\n作为换行模式 我正在尝试将它们全部更改为\r\n,并删除连续的换行符。从理论上讲,这很简单,并且可以包含任意数量的非常简单的正则表达式 但实际上 text = re.sub( reg_exp, r'\r\n', text) 在该字符串上(大写字母表示行尾) 我不确定您是否正确复制/粘贴了示例字符串,但每次出现\r\n字符串之间都有一个额外的字符,因此基本上如下正则表达式: re.sub(r'(\r\n.?)+', r'\r\n',

我有一些文件可以使用
\r
\n
\r\n
作为换行模式

我正在尝试将它们全部更改为
\r\n
,并删除连续的换行符。从理论上讲,这很简单,并且可以包含任意数量的非常简单的正则表达式

但实际上

text = re.sub(
    reg_exp,
    r'\r\n',
    text)
在该字符串上(大写字母表示行尾)


    我不确定您是否正确复制/粘贴了示例字符串,但每次出现
    \r\n
    字符串之间都有一个额外的字符,因此基本上如下正则表达式:

    re.sub(r'(\r\n.?)+', r'\r\n', text)
    
    将删除以下任何一项:

    \r\n\r\n
    \r\n \r\n
    \r\n\n\r\n
    \r\n\r\n\r\n
    \r\n \r\n \r\n
    \r\n\r\n \r\n
    \r\n \r\n\r\n
    ...
    
    全面测试:

    >>> text =  """<ul>\r\n \r\n <li><a href="#">link</a></li>\r\n \r\n <li><a href="#">link</a></li>\r\n <li><a href="#">link</a></li>\r\n \r\n <li><a href="#">link</a></li>\r\n \r\n </ul>\r\n"""
    >>> print text
    <ul>
    
     <li><a href="#">link</a></li>
    
     <li><a href="#">link</a></li>
     <li><a href="#">link</a></li>
    
     <li><a href="#">link</a></li>
    
     </ul>
    >>> print re.sub(r'(\r\n.?)+', r'\r\n', text).__repr__()
    '<ul>\r\n<li><a href="#">link</a></li>\r\n<li><a href="#">link</a></li>\r\n<li><a href="#">link</a></li>\r\n<li><a href="#">link</a></li>\r\n</ul>\r\n'
    >>> print re.sub(r'(\r\n.?)+', r'\r\n', text)
    <ul>
    <li><a href="#">link</a></li>
    <li><a href="#">link</a></li>
    <li><a href="#">link</a></li>
    <li><a href="#">link</a></li>
    </ul>
    
    也可以工作,并且只能支持
    \n
    字符串


    HTH

    您还可以对字符串使用splitlines(),并用“\r\n”连接行

    >>> text = '<ul>\r\n \r\n <li><a href="#">link</a></li>\r\n \r\n <li><a href="#">link</a></li>\r\n <li><a href="#">link</a></li>\r\n \r\n <li><a href="#">link</a></li>\r\n \r\n </ul>\r\n\r \n'
    >>> print '\r\n'.join([x for x in text.splitlines() if x.strip()])
    <ul>
     <li><a href="#">link</a></li>
     <li><a href="#">link</a></li>
     <li><a href="#">link</a></li>
     <li><a href="#">link</a></li>
     </ul>
    
    >>text='
      \r\n\r\n
    • \r\n\r\n
    • \r\n
    • \r\n\r\n
    • \r\n\r\n >>>打印'\r\n'.join([x表示text.splitlines()中的x,如果x.strip()]))

    事实证明问题出在Python将字符串写回Windows文件系统时。它对如何处理行尾做出了一些意想不到的决定。具体而言,它决定:

    • \r
      应该写
      \r
    • \n
      应该写
      \r\n
      (什么!?)
    和都有在Python控制台中工作的答案,正如问题中的代码一样

    为了完整起见,这就是
    write()
    的外观:

    with open(file_name, 'r+') as f:
        text = f.read()
    
        # text = re.sub(...)
    
        f.seek(0)
        f.write(text)
        f.truncate()
    
    with open(file_name, 'r+') as f:
        text = f.read()
    
        # text = re.sub(...)
    
        f.seek(0)
        f.write(text)
        f.truncate()