【问题标题】:python regexp add <br> after every 4th period每 4 个周期后 python 正则表达式添加 <br>
【发布时间】:2015-02-03 09:10:15
【问题描述】:

我想在每 4 个句点之后插入&lt;br&gt;,但不是当句点代表小数或字母缩写时?

我已经通过this,但是由于我是正则表达式的新手,有人可以指导我如何在 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 之后

【问题讨论】:

  • 举个例子会更好。
  • 请查看更新后的代码...
  • Regex 不是你需要的。
  • 如何区分“美元走强”。从“我移民到美国这并不容易”。 ? “我们。”以后者结束一个句子,但不以前者结束。它可能需要自然语言处理来区分这些情况。当然,仅靠正则表达式是无法做到的。
  • 正如@MarounMaroun 所说,正则表达式可能太复杂了。正则表达式不擅长上下文感知,您需要了解上下文才能确定“博士”、“夫人”。或“等”实际上,不是句子结尾。你需要一个语言解析器,例如nltk.org

标签: python regex


【解决方案1】:
((?:.*?(?<![A-Z])\.(?=\s*[A-Z]|\s*$)){4})

试试这个。替换为\1&lt;br&gt;。见演示。

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)

正如 cmets 中所说,不可能有万无一失的正则表达式可以做你想做的事,但如果你的输入是固定的,如果你没有任何其他方式,你可以在某种程度上处理。这里

我们通过捕获直到 . 的任何内容然后将其替换为 \1br 来找到 4 个句子块。但是. 不应该是小数,所以添加了一个前瞻,. 后面的任何内容都应该是空格和大写字母。为了否定缩写,添加了一个后视,. 后面不应该有 a capital 字母。这有一个陷阱,因为如果 U.S. 出现在句末,它将失败。

【讨论】:

  • 不适用于Dr. Name。将Dr. 视为句点
  • 如何使用正则表达式在每 4 个周期后添加
    ,而不考虑小数或缩写部分。
  • @user1162512 您可以为此添加(?&lt;!Dr),也可以添加Mr Mrs。请参阅此处regex101.com/r/vD5iH9/53
  • 你能解释一下正则表达式吗?我不擅长它。谢谢
  • @user1162512 它应该可以工作。你能证明你是在终端上做的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 2017-08-29
  • 1970-01-01
相关资源
最近更新 更多