我想在每隔4个句点后插入<br>
,但是当句点代表小数或字母缩写时不是吗?
我已经完成了this,但由于我是regex的新手,有人可以指导我如何在Python中编写等效文件吗?
例如: -
'I'm a Python programmer. I love to code. I'm a boy. I earn $100.39 , from which I spend $50 in xyz. I eat biscuits. I eat snacks.I eat pizza etc. '
预期的O / P
'I'm a Python programmer. I love to code. I'm a boy. I earn $100.39 , from which I spend $50 in xyz.<br> I eat biscuits. I eat snacks.I eat pizza etc. '
说明 -
由于100.39中的.
不被视为句点,因此它实际上是一个小数,因此此字符串中的第4个句点是xyz
答案 0 :(得分:1)
((?:.*?(?<![A-Z])\.(?=\s*[A-Z]|\s*$)){4})
试试这个。替换为\1<br>
。见演示。
https://regex101.com/r/vD5iH9/50
import re
p = re.compile(r'((?:.*?(?<![A-Z])\.(?=\s*[A-Z]|\s*$)){4})')
test_str = "I'm a Python programmer. I love to cX.Yode. I'm a boy. I earn $100.39 , from which I spend $50 in xyz. I eat biscuits. I eat snacks.I eat pizza etc. "
subst = "\1<br>"
result = re.sub(p, subst, test_str)
正如评论中所说,不能有万无一失的正则表达式可以做你想要的,但如果你的输入被修复,你可以在某种程度上处理,如果你没有任何其他方式。在这里
我们通过捕获.
之前的任何内容然后将其替换为\1br
来找到4个句子块。但是.
不应该是小数,所以添加了一个前瞻,即.
之后的任何内容都应该是空格和大写字母。为了否定缩写,添加了.
后面不应该有a capital
字母的后视。这有一个陷阱,但如果U.S.
如果在句末结束时它会失败。