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

3

我希望你能够帮助我将连续的多个换行符后面紧跟大写字母的文本转换为"____",以便我能够解析它们。

例如:

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
把加号 + 放在括号内 - ([\n]+)([A-Z]+) - 或者直接省略。 - undefined
什么是特定的字符串?请在您的帖子中进行更新。 - undefined
@SebastianProske 我使用 re.sub() 函数将 i 中的换行符后面的首字母大写的单词替换为 "____" + 首字母大写的单词,但是它仍然会保留首字母大写的单词。 - undefined
@BYOR 看看我的修改 - 你把错的 + 移动了 :P - undefined
1
正如@SebastianProske所指出的那样,你需要将+放在括号内,就像这样:i = re.sub(r'(\n+)([A-Z]+)', r"____\2", i) 另外,只有一个字符时不需要使用方括号。 - undefined
显示剩余3条评论
3个回答

6

编辑:要将多个连续的换行符 (\n) 替换为 ____,可以使用以下方法:

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

(?=[A-Z]) 是断言“大写字母后面跟换行符”。正则表达式演示


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]+)作为模式。

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

请参考演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接