正则表达式:替换除数字,特定字符和特定单词以外的所有字符

时间:2019-11-28 07:19:32

标签: python regex

如果我有这样的文字:

    CARBON                                                               1569
    1.00% IRON                                                           234
    99% CARBON, 1% IRON                                                  181
    98.2% CARBON 1% ZINC                                                 181
    99% CARBON#1% IRON                                                   141
    ASD CARBON 2% IRON RANDOMWORD                                        23

假设我只想保留元素名称和百分比值(包括数字,小数点和百分比符号)。我可以运行正则表达式替换来做到这一点。我尝试了很多组合,例如(CARBON|IRON|ZINC),它替换所有出现的元素名称,以及[^0-9.\%]+,它保留所有百分比值。 / p>

但是我不知道如何将它们组合在一起,以便我保留两个百分比值和元素名称。任何帮助将不胜感激。

编辑:为了使输出有意义,还需要保留空格。所有不必要的字符都可以用空格替换。预期的输出将是

    CARBON                                                               1569
    1.00% IRON                                                           234
    99% CARBON  1% IRON                                                  181
    98.2% CARBON 1% ZINC                                                 181
    99% CARBON 1% IRON                                                   141
        CARBON 2% IRON                                                   23

3 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式匹配所需的文本:

\b(CARBON\b|IRON\b|ZINC\b|\d+(?:\.\d+)?(?:%|\b))|\S

并用'\1 '代替(将在输入行中添加尾随空格)

RegEx Demo

正则表达式详细信息:

  • \b:单词边界
  • (:开始捕获组
    • CARBON\b:匹配CARBON,后跟单词边界
    • |:或
    • IRON\b:匹配IRON,后跟单词边界
    • |:或
    • ZINC\b:匹配ZINC,后跟单词边界
    • |:或
    • \d+(?:\.\d+)?:匹配整数或浮点数
    • (?:%|\b):后跟%或单词边界
  • )
  • |:或
  • \S:匹配一个非空白字符

答案 1 :(得分:1)

为简化您的操作,请按照您的要求从这里开始:

\b(?!CARBON|ZINC|IRON)[a-zA-Z#]+

然后,您可能必须根据您的评论发布某些内容(例如#被空白替换)。

REGEX101

答案 2 :(得分:1)

您可以尝试替换所有单词,除了: *元素名称 *数字 *百分比。

要实现此目的,您可以使用负前瞻:

(?!CARBON|IRON|ZINC|(\d+\.\d+\%)|\d+)\b[a-zA-Z#]+

Demo