使用Python中的正则表达式查找并替换文件中的单词列表

Chr*_*rry 7 python regex python-2.7

我想将文件的内容打印到终端,并在此过程中突出显示列表中找到的任何单词而不修改原始文件.这是一个尚未运行的代码示例:

    def highlight_story(self):
        """Print a line from a file and highlight words in a list."""

        the_file = open(self.filename, 'r')
        file_contents = the_file.read()

        for word in highlight_terms:
            regex = re.compile(
                  r'\b'      # Word boundary.
                + word       # Each item in the list.
                + r's{0,1}', # One optional 's' at the end.
                flags=re.IGNORECASE | re.VERBOSE)
            subst = '\033[1;41m' + r'\g<0>' + '\033[0m'
            result = re.sub(regex, subst, file_contents)

        print result
        the_file.close()

highlight_terms = [
    'dog',
    'hedgehog',
    'grue'
]
Run Code Online (Sandbox Code Playgroud)

实际上,只会突出显示列表中的最后一项,无论它是什么或列表有多长.我假设每次替换都会执行,然后在下一次迭代开始时"忘记".它看起来像这样:

Grues众所周知,人类和非人类都可以吃动物.在光线不足的地区,任何富裕人士都认为狗和刺猬是grue美味佳肴.grue然而,狗可以通过在音阶中吠叫来吓唬.另一方面,刺猬必须简单地屈服于成为适合grue国王的热狗的命运.

但它应该是这样的:

Grues众所周知,人类和非人类都可以吃动物.在光线不足的地区dogs,hedgehogs任何富裕人士都认为grue是美味佳肴.然而,可以通过在音阶中吠叫Dogs来吓跑grue.一hedgehog,在另一方面,必须完全听任其成为热狗适合命运grue王.

如何阻止其他替换丢失?

ssh*_*124 5

您可以将正则表达式修改为以下内容:

regex = re.compile(r'\b('+'|'.join(highlight_terms)+r')s?', flags=re.IGNORECASE | re.VERBOSE)  # note the ? instead of {0, 1}. It has the same effect
Run Code Online (Sandbox Code Playgroud)

然后,您将不需要for循环.

此代码获取单词列表,然后将它们与a连接在一起|.所以如果你的列表是这样的:

a = ['cat', 'dog', 'mouse'];
Run Code Online (Sandbox Code Playgroud)

正则表达式将是:

\b(cat|dog|mouse)s?
Run Code Online (Sandbox Code Playgroud)