替换文件中的词。

3

我需要替换给定文件中的单词,但问题是该单词可能是其他不应该被替换的单词的一部分,因此不能使用string.replace()方法。这些单词也可能包含像".,;:!?"这样的符号。

例如,在给定文件中有一个句子:Bobtail has a tail. 所有的"tail"都必须替换为"head",所以这种情况下答案应该是Bobtail has a head.


1
你可以使用正则表达式:https://dev59.com/zGbWa4cB1Zd3GeqPYqLn#11697492 - MSH
3个回答

2

最简单的解决方法,可能已经足够适合您的需求,在.replace()函数中添加一些空格以替换您想要替换的单词。

使用您的示例:

str = "Bobtail has a tail."
print(str.replace("tail", "nose")) # Bobnose has a nose.
print(str.replace(" tail", "nose")) # Bobtail has a nose.

下一步是使用正则表达式查找要替换的字符串。这需要更复杂和特定于情况,因此您可能想使用类似于RegExr的工具来尝试构建一个。请注意保留html标签。

2
这对以tail开头的单词不起作用,例如Bobtail和tailBob都有尾巴。这将给出Bobtail和nosebob有鼻子。 - bAN
1
我假设它可能不适用于所有操作系统的情况,因此正则表达式将是下一个最佳解决方案。 - Dan P

1

对于这种复杂的字符串搜索,您需要使用正则表达式。在Python中,可以通过导入RE模块来实现。然后,您可以使用search()方法在字符串中查找任何给定的正则表达式。结果可以通过group()方法访问。假设您知道如何循环遍历文件内容,您的解决方案如下:

import re

substring = some_file.txt
result =[]
for e in substring:
    regexp = re.search("(\s|\.|\,|\?|\!|\:|\;)tail(\s|\.|\,|\?|\!|\:|\;)",e,1)
    if regexp.group() is not None:
        result.push(e.replace(regexp.group(),"head"))
    else:
        result.push(e)

您可以在此处练习正则表达式: https://regexr.com/

为简单起见,我没有包含每个特殊字符。请注意,您必须使用反斜杠字符进行转义。使用\s表示空格。


1
正则表达式可能看起来像这样:[ .,:!;?]SUBSTRING[ .,:!;?]。请注意,您需要转义SUBSTRING内部的特殊符号,以便它们不被正则表达式解释。 - somerandomdev49
我练习了一下,然后使用代码中提供的正则表达式。\s 可以用于空格字符。 - Brakke Baviaan
1
我在添加评论之前就已经发表了评论,我不确定为什么你会使用 (\.|\,|\:|...) 然后再加上 \s。如果你真的想要一个 \s,你应该写成 (\s|[..:;?!])... - somerandomdev49
此外,您应该仅替换中间组而不是整个内容。 - somerandomdev49
你说得对,你可以不用过于复杂的括号。我只是在regexr.com上快速制作了这个正则表达式,并检查它是否选择了所需的部分。可能有更优雅的解决方案。 - Brakke Baviaan

1

像Dan P所提到的,你需要的是Python的re模块,特别是sub方法。

以这个字符串为例:

s = "Bobtail has a !!tail.!! and the ..tail> is just a part of Bobtails' body"

使用正则表达式的单词边界运算符\b

resulting_string = re.sub('\\btail\\b','head', s)
"Bobtail has a !!head.!! and the ..head> is just a part of Bobtails' body"

为了消除特殊字符,您可以在正则表达式模式中选择更复杂的内容,例如:

要消除特殊字符,可以在正则表达式模式中选择更复杂的内容,比如:

resulting_string = re.sub('\\W\\S?tail\\S*','head',s)
"Bobtail has a head and the head is just a part of Bobtails' body"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接