查找并删除字符串中略有不同的子字符串

Find and remove slightly different substring on string

我想查明字符串中是否包含子字符串,并在不触及字符串其余部分的情况下将其删除。问题是我必须执行搜索的子字符串模式并不完全是字符串中包含的内容。特别是问题是由于西班牙口音和大写子字符串,例如:

myString = 'I'm júst a tésting stríng'
substring = 'TESTING'

执行某事可获得:

resultingString = 'I'm júst a stríng'

现在我已经读到 difflib 库可以比较两个字符串并以某种方式对其相似性进行加权,但我不确定如何针对我的情况实现这一点(没有提到我未能安装它库).

谢谢!

您可以使用包 unicodedata 将重音字母标准化为 ascii 代码字母,如下所示:

import unicodedata
output = unicodedata.normalize('NFD', "I'm júst a tésting stríng").encode('ascii', 'ignore')
print(str(output))

这会给

b"I'm just a testing string"

然后您可以将其与您的输入进行比较

"TESTING".lower() in str(output).lower()

哪个应该 return True.

这个 normalize() 方法可能有点矫枉过正,也许使用 @Harpe 在 的代码可以正常工作。

在这里,我将把原始字符串分解成“单词”,然后将所有 non-matching 个单词重新组合成一个字符串:

import unicodedata
def normalize(text):
    return unicodedata.normalize("NFD", text).encode('ascii', 'ignore').decode('utf-8').lower()

myString = "I'm júst a tésting stríng"
substring = "TESTING"
newString = " ".join(word for word in myString.split(" ") if normalize(word) != normalize(substring))

print(newString)

给你:

I'm júst a stríng

如果您的“子字符串”可以是 multi-word,我可能会考虑将策略转换为正则表达式:

import re
import unicodedata

def normalize(text):
    return unicodedata.normalize("NFD", text).encode('ascii', 'ignore').decode('utf-8').lower()

myString = "I'm júst á tésting stríng"
substring = "A TESTING"
match = re.search(f"\s{ normalize(substring) }\s", normalize(myString))
if match:
    found_at = match.span()
    first_part = myString[:found_at[0]]
    second_part = myString[found_at[1]:]
    print(f"{first_part} {second_part}".strip())

我想这会给你:

I'm júst stríng