我已经编写了一个函数来删除字符串的某些单词和字符。使用文件将有问题的字符串读入程序。该程序工作正常,除非文件在任何地方,在文件正文的任何位置包含以下内容。
安全启动安全更新(3177404)此安全更新 解决了Microsoft Windows中的漏洞。这个漏洞可以 如果是攻击者,则允许绕过安全启动安全功能 在目标设备上安装受影响的策略。攻击者必须拥有 管理权限或物理访问权限安装 策略并绕过安全启动。
我从来没有经历过这种奇怪的行为。有人有什么建议吗?
这是我写的功能。
def scrub(file_name):
try:
file = open(file_name,"r")
unscrubbed_string = file.read()
file.close()
cms = open("common_misspellings.csv","r")
for line in cms:
replacement = line.strip('\n').split(',')
while replacement[0] in unscrubbed_string:
unscrubbed_string = unscrubbed_string.replace(replacement[0],replacement[1])
cms.close()
special_chars = ['.',',',';',"'","\""]
for char in special_chars:
while char in unscrubbed_string:
unscrubbed_string = unscrubbed_string.replace(char,"")
unscrubbed_list = unscrubbed_string.split()
noise = open("noise.txt","r")
noise_list = []
for word in noise:
noise_list.append(word.strip('\n'))
noise.close()
for noise in noise_list:
while noise in unscrubbed_list:
unscrubbed_list.remove(noise)
return unscrubbed_list
except:
print("""[*] File not found.""")
答案 0 :(得分:1)
您的代码可能因为.replace()
来电while
循环而挂起。如果对于.csv
文件的任何特定行,replacement[0]
字符串是其相应replacement[1]
的子字符串,并且其中任何一个出现在您的关键字中文本,然后while
循环永远不会完成。实际上,您根本不需要while
循环 - 单个.replace()
调用将替换所有匹配项。
但这只是你目前使用毯子unscrubbed_string.replace(...)
的方法遇到的问题的一个例子。你需要使用正则表达式替换(来自re
)模块,或者自己将字符串分解为单词并逐字逐句地工作。为什么?好吧,这是一个简单的例子:'Teh'
需要更正为{{1}} - 但如果文档中包含对'The'
的引用,该怎么办?你的"安全启动"文本将包含一个类似于此的示例。
如果你去正则表达式路线,符号'Tehran'
通过匹配任何类型的词边界(字符串的开头或结尾,空格,标点符号)来解决这个问题。这是一个简单的例子:
\b
输出,强调错误:
Teh 伊朗的首都是德黑兰。 Teh 法国的首都是巴黎。 (
import re replacements = { 'Teh':'The', } unscrubbed = 'Teh capital of Iran is Tehran. Teh capital of France is Paris.' better = unscrubbed naive = unscrubbed for target, replacement in replacements.items(): naive = naive.replace(target, replacement) pattern = r'\b' + target + r'\b' better = re.sub(pattern, replacement, better) print(unscrubbed) print(naive) print(better)
)伊朗首都 Theran 。法国首都是巴黎。 (
unscrubbed
)伊朗首都是德黑兰。法国首都是巴黎。 (
naive
)