【问题标题】:Python: Get rid of punctuation marks with conditionPython:用条件去掉标点符号
【发布时间】:2018-11-19 12:06:35
【问题描述】:

我可以用这一行去掉我的数据框中的标点符号:

df[column_name].replace(r'[^\s0-9a-zA-Z]+', r'', regex=True, inplace=True)

但我想保留一些例外情况,例如:

我不想将 15,00 转换为 1500。如果文本中有逗号,我想保留它。有没有一种简单的方法可以做到这一点。谢谢你。

【问题讨论】:

  • 输入数据是什么,预期输出是什么?
  • 是什么让 15,00 与众不同?
  • "如果文本内有逗号":在文本内,还是在数字内?如果逗号后面有一个空格,例如总结:“从数字 10、20、30、40 或 50 中选择”怎么办?
  • 感谢您的回复。是的,我想要的情况是数字之间的逗号,它不应该只考虑带逗号的那些,就像我上面给出的例子一样。

标签: python regex database ascii


【解决方案1】:

如果您附加 (?<!\d,(?=\d)) 后视,则在使用模式时可以避免在数字之间匹配逗号:

r'[^\s0-9a-zA-Z](?<!\d,(?=\d))'
                ^^^^^^^^^^^^^^

regex demo

简而言之,[^\s0-9a-zA-Z] 匹配除空格和 ASCII 字母或数字之外的任何字符。如果紧邻当前位置的左侧有一个数字 , 并且紧邻 , 的右侧有一个数字,则 (?&lt;!\d,(?=\d)) 后视失败匹配。后向内的前瞻是必要的,以确保逗号在后向中“映射”到 [^\s0-9a-zA-Z] 模式。

此外,如果您使用(?&lt;!\d(?=,\d))[^\s0-9a-zA-Z],还有一种方法可以在匹配否定字符类之前执行此检查,请参阅demo。但是,这种方法的成本要高得多,因为后视不会“锚定”在任何文本或零宽度断言上。

【讨论】:

    猜你喜欢
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    相关资源
    最近更新 更多