python - 如何使用 Python 从一行文本中过滤掉表达式?

标签 python regex string text

我想删除不属于预定义列表的单词。例如,如果我的列表是:

ANIMAL
BIRD
CARNIVORE
HERBIVORE
MAMMAL
OMNIVORE

我的输入是这样的:

(ANIMAL (CARNIVORE (BIRD Peacock)) (HERBIVORE (MAMMAL Goat)))

我希望我的输出是:

(ANIMAL (CARNIVORE (BIRD )) (HERBIVORE (MAMMAL )))

我试过这个:

current_split = re.split("\W", test)
    for thing in current_split:
        if thing in parse_symbols:
            print thing

但这会删除括号,我明白了:

ANIMAL
CARNIVORE
BIRD
HERBIVORE
MAMMAL

此外,由于 for 循环,换行符被引入,这是我不想要的。

我做错了什么?

最佳答案

这是万无一失的解决方案:将 re.sub 与函数一起使用。首先获取允许的单词的:

allowed = set("""
    ANIMAL
    BIRD
    CARNIVORE
    HERBIVORE
    MAMMAL
    OMNIVORE
""".split())

或使用

allowed = {'ANIMAL', 'BIRD', #... and so forth

然后 re.sub 每个单词都有一个正则表达式 \w+,然后检查它们是否在 ok 中 - 如果是,然后返回那个词,否则返回一个空字符串:

def replacement(match):
    word = match.group(0)
    if word in allowed:
        return word
    return ''

result = re.sub(r'[\w-]+', replacement, user_input)
print(result)

打印

(ANIMAL (CARNIVORE (BIRD )) (HERBIVORE (MAMMAL )))

与此处提供的各种 .replace 解决方案不同,这将只考虑整个单词和整个单词。如果整个单词都在允许的单词集中,它只会保留一个单词。它永远不会删除完整单词的一部分。它适用于任何分隔符和运算符。

如果你想删除右括号前的任何多余空间,请使用另一个替换:

re.sub(r'\s+\)', '', result)

上面的结果会产生什么

(ANIMAL (CARNIVORE (BIRD) (HERBIVORE (MAMMAL))

关于python - 如何使用 Python 从一行文本中过滤掉表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45158422/

相关文章:

python - 将原始二进制图像传递到 Azure 认知服务 API

python - 使用正则表达式量词 python 时出现关键错误

python - Python 3.7中使用工厂函数生成注释类型时出现 “typing.ClassVar”问题

名称的 Javascript 验证正则表达式

mysql - 如何在一列中搜索 3 个字母的单词 - MySQL?

python - 设置默认国家

regex - Bash 使用 awk 从文件中选择有效行

Javascript 正则表达式模式匹配

带有特殊字符的 Ruby 1.9

string - 从 TStringList 中删除字符串