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王.
如何阻止其他替换丢失?
您可以将正则表达式修改为以下内容:
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)
归档时间: |
|
查看次数: |
233 次 |
最近记录: |