python正则表达式 - 将换行符(\ n)替换为其他内容

时间:2016-03-18 18:19:42

标签: python regex

我正在尝试将多个连续换行符后跟一个大写字母转换为“____”,以便我可以解析它们。

例如,

i = "Inc\n\nContact"
i = re.sub(r'([\n]+)([A-Z])+', r"____\2", i) 

In [25]: i
Out [25]: 'Inc____Contact'

这个字符串工作正常。我可以稍后使用____解析它们。

然而,它不适用于此特定字符串。

i =  "(2 months)\n\nML"
i = re.sub(r'([\n]+)([A-Z])+', r"____\2", i)

Out [31]: '(2 months)____L'

它吃了资本M. 我在这里缺少什么?

3 个答案:

答案 0 :(得分:3)

编辑要将多个连续换行符(\n)替换为____,应执行以下操作:

>>> import re
>>> i =  "(2 months)\n\nML"
>>> re.sub(r'(\n+)(?=[A-Z])', r'____', i)
'(2 months)____ML'

(?=[A-Z])是断言"换行符后跟大写字母"。 REGEX DEMO

答案 1 :(得分:1)

让我们来看看你的正则表达式([\n]+)([A-Z])+ - 第一部分([\n]+)很好,将换行符的多个出现匹配到一个组中(注意 - 这与回车符不匹配\r)。但是,第二部分([A-Z])+会导致您的错误,它会将单个大写字母与捕获组匹配 - 多次,如果有多个大写字母,则会将该组重置为最后匹配的大写字母,然后使用替换。

尝试以下操作,看看会发生什么

import re    
i = "Inc\n\nABRAXAS"
i = re.sub(r'([\n]+)([A-Z])+', r"____\2", i)

您可以简单地将+放在捕获组内,这样就可以匹配多个大写字母。你也可以把它留下来,因为它没有什么区别,这些大写字母有多少跟随。

import re    
i = "Inc\n\nABRAXAS"
i = re.sub(r'(\n+)([A-Z])', r"____\2", i)

如果您想要替换任何一行的换行符,无论如何 - 完全删除([A-Z])并尝试

import re
i = "Inc\n\nABRAXAS"
i = re.sub(r'(\n+)', r"____", i)

如果您想考虑回车

,也可以使用([\r\n]+)作为模式

答案 2 :(得分:0)

尝试:

import re
p = re.compile(ur'[\r?\n]')
test_str = u"(2 months)\n\nML"
subst = u"_"

result = re.sub(p, subst, test_str)

它会将字符串缩减为

(2 months)__ML

请参阅Demo