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

guz6ccqo  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(109)

我有一些文件可以使用\r\n\r\n作为其换行符模式。
我尝试将它们全部更改为\r\n,并删除连续的换行符。从理论上讲,这很容易,任何数量的very simple regexes都可以工作。
但实际上,

text = re.sub(
    reg_exp,
    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>␍␊
  • 对于reg_exp = r'[\r\n]{2,}'
<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>␍␊
  • 对于reg_exp = r'[\r\n]+'
<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>␍
␍␊

我不知道为什么
我的正则表达式是否由于某种原因与\r不匹配?

mefy6pfw

mefy6pfw1#

我不确定你是否正确地复制/粘贴了你的示例字符串,但是在\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>

下面的正则表达式:

print re.sub(r'([\r\n]+.?)+', r'\r\n', text)

也可以工作,可以支持\n-only字符串。

t8e9dugd

t8e9dugd2#

您也可以在字符串上使用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>
9rnv2umw

9rnv2umw3#

原来问题是当Python将字符串写回Windows文件系统时。它对行尾做了一些意想不到的决定。具体而言,委员会决定:

  • \r应写入\r
  • \n应该写**\r\n(什么!?)**

zmoLouis都有在Python控制台中工作的答案,问题中的代码也是如此。
为了完整起见,这是write()的外观:

with open(file_name, 'r+') as f:
    text = f.read()

    # text = re.sub(...)

    f.seek(0)
    f.write(text)
    f.truncate()

相关问题