我需要替换给定文件中的单词,但问题是该单词可能是其他不应该被替换的单词的一部分,因此不能使用string.replace()
方法。这些单词也可能包含像".,;:!?"
这样的符号。
例如,在给定文件中有一个句子:Bobtail has a tail.
所有的"tail"都必须替换为"head",所以这种情况下答案应该是Bobtail has a head.
最简单的解决方法,可能已经足够适合您的需求,在.replace()
函数中添加一些空格以替换您想要替换的单词。
使用您的示例:
str = "Bobtail has a tail."
print(str.replace("tail", "nose")) # Bobnose has a nose.
print(str.replace(" tail", "nose")) # Bobtail has a nose.
对于这种复杂的字符串搜索,您需要使用正则表达式。在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
表示空格。
[ .,:!;?]SUBSTRING[ .,:!;?]
。请注意,您需要转义SUBSTRING
内部的特殊符号,以便它们不被正则表达式解释。 - somerandomdev49(\.|\,|\:|...)
然后再加上 \s
。如果你真的想要一个 \s
,你应该写成 (\s|[..:;?!])...
。 - somerandomdev49像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"