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()