我正在尝试将多个连续换行符后跟一个大写字母转换为“____”,以便我可以解析它们。
例如,
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. 我在这里缺少什么?
答案 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