【问题标题】:Python regex: Subsentence that contains number which can have thousand separator and decimalPython正则表达式:包含可以有千位分隔符和小数的数字的子句
【发布时间】:2021-02-16 16:10:19
【问题描述】:

我有以下文字。我想收集所有包含数字的子句(从逗号或句点到逗号或句点)。我设法创建了以下正则表达式来收集数字和它之后的部分,但是由于我的数字里面可以有逗号或句点,我不知道如何抓住它之前的单词。带有部分的句子我会喜欢加粗:

为了完成本次献祭,我们将进入 与 OrION Capital Structure 签订远期购买协议 Solutions UK Limited 或 OrION,我们的赞助商的附属公司,根据 OrION 将承诺向我们购买 10,000,000 远期购买单位或由其选择,最多总计 30,000,000 个远期购买单位,每个单位包含一个 A 类 普通股或远期购买股,以及三分之一的 认股权证购买一股 A 类普通股,或远期购买 认股权证,每单位 10.00 美元或总额为 100,000,000 美元或由 OrION 选择,总额不超过 300,000,000 美元,以 与我们的关闭同时关闭的私募 初始业务合并。

我要收集的东西:

["pursuant to which OrION will commit that it will purchase from us 10,000,000 forward purchase units",
"or at its option up to an aggregate maximum of 30,000,000 forward purchase units", "for $10.00 per unit", "or an aggregate amount of $100,000,000", "or at OrION’s option up to an aggregate amount of $300,000,000"]

我当前编写的正则表达式获取数字和后面的部分,直到下一个逗号或句点。

[0-9]{1,2}([,.][0-9]{1,2})?.*?[\.,]

如何收集句子的一部分(以句点或逗号开头),以及其中可以有小数或千位分隔符的数字,然后是句子的一部分,直到下一个逗号或句点?

编辑:anubhava 和 bb1 都给出了正确的解决方案。 anubhava 完全按照我的要求解决了这个问题,这是正确的答案。然而,bb1 为一定会发生的事情做准备(我没有想到),所以最后我使用了他的答案,但将 anubhava 标记为给出解决方案的人,因为这是我所要求的确切解决方案。

编辑 2:anubhava 更新了他的答案,因此它解决了与 bb1-s 相同的问题。

【问题讨论】:

  • 不正确的欺骗。这个问题是不同的,甚至在欺骗答案中的一个答案都不是当前问题的解决方案。

标签: python regex


【解决方案1】:

您可以将此正则表达式与环视断言一起使用:

(?<=[.,] )(?:[^,.]*?\d+(?:[.,]\d+)*)+[^.,]*(?=[,.])

RegEx Demo

正则表达式详细信息:

  • (?&lt;=[.,] ):Lookbehind 断言断言我们在当前位置之前有逗号或点,后跟一个空格
  • (?::启动非捕获组
    • [^,.]*?:匹配 0 个或多个不是 ,. 的任何字符(惰性)
    • \d+(?:[.,]\d+)*:匹配一个可能包含.,的数字
  • )+:结束非捕获组。 + 重复此组 1 次以上
  • [^.,]*:匹配 0 个或多个不是 ,. 的任何字符
  • (?=[,.]):前瞻断言断言我们在当前位置后有逗号或点

【讨论】:

  • 是的,这正是我所要求的。谢谢!
  • 看到您对其他答案的评论,我意识到您可能遇到每个句子有多个数字的情况。因此,我也稍微更新了我的答案以解决这种情况。
  • 谢谢,我知道我可能没有说出来,但更新它会确保每个人以后都能复制更可靠的答案。
【解决方案2】:

如果字符串段中有一个数字,用逗号或句点括起来,则anubhava的解决方案效果很好,但不包括有多个数字的情况,例如

"Therefore, this costs $10,000 and that costs $20,000 per item."

如果有帮助,这里有一个处理这种情况的版本:

(?<=[,.])(?:[^,.]*?\d+(?:[,.]\d+)*[^,.]*?)+(?=[,.])

【讨论】:

  • 这实际上是我以前没有考虑过的。我对 stackoverflow 的习惯还不太熟悉,最后我将 anubhavas 的答案标记为解决方案,因为它正是解决上述问题的方法。但是最后我使用的是你的,因为它为即将发生的事情做准备,而我没有想到。我会在问题中说明这一点。
猜你喜欢
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多