【问题标题】:Regex remove punctuation but not between digits incorrect result正则表达式删除标点符号但不在数字之间不正确结果
【发布时间】:2022-01-11 11:46:59
【问题描述】:

我正在为 SpaCy 预处理文本并尝试删除标点符号,数字之间除外。但是,在某些情况下,当标点符号与数字连接时,它不会被删除。您能否建议如何处理这种极端情况?

一个例子:

import re

text = "Fast-charge $ EV ! battery maker StoreDot pulls in $80.7M led led by Vietnam’s VinFast"

preprocessed = re.sub(r'(?<!\d)[%$!.,,;:’“”—-](?!\d)',' ', text)

print(preprocessed)

# Fast charge   EV   battery maker StoreDot pulls in $80.7M led by Vietnam s VinFast

预期结果:

# Fast charge   EV   battery maker StoreDot pulls in 80.7M led by Vietnam s VinFast

【问题讨论】:

  • 也许断言不是一侧的数字? (?&lt;!\d)[$!.,;:’“”—-]|[$!.,;:’“”—-](?!\d)regex101.com/r/JD2oEK/1
  • 您特别想保留什么?只有逗号和点之间的数字?
  • @JvdV 是的,我只想留下数字,以便 SpaCY 可以将其识别为数字。本质上,我与 $ 和 % 斗争。
  • @Thefourthbird 不知道为什么,但这不适用于“根据 Coinbase 数据,比特币下跌 4.3% 和以太币下跌 5.1%”这样的情况
  • @Thefourthbird,太棒了,非常感谢,是的,它有效!您能否在答案中解释一下,真的很感激吗?

标签: python regex


【解决方案1】:

否定的环视应该在两边都为真,这样就不会匹配$80中的$

您可以使用替换| 表示没有数字,来匹配断言左侧或右侧的字符类中的一个字符。

(?<!\d)[%$!.,;:’“”—-]|[%$!.,;:’“”—-](?!\d)

查看regex demo

备注

  • 示例字符串中有led led,预期结果中有一个led,但我认为这是一个错字,因为字符类无法匹配led

  • 在字符类中, 也有一个双重条目。

  • 不确定是否要保留它们,但在替换中使用空格可能会留下双倍间距,正如您在预期结果中看到的那样。如果要删除它们,可以使用strip() 删除前导和尾随空格,并使用 sub 和r"[^\S\n]{2,}" 匹配2个或多个不带换行符的空格并将它们替换为单个空格

【讨论】:

  • 非常感谢您的精彩解释,现在更清楚了。特别感谢双空格的评论,我确实有这个问题!
  • @Cassiopea 不客气 :-) 祝你好运!
猜你喜欢
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多