我正在尝试开发一个函数,该函数从用户获取一个名称,并尝试将该名称与一个任意保留的用户名数据库进行匹配。(保留名称)是可变长度的,用户名可以是任何内容。我试图防止用户使用基本上保留的用户名,但用户名的长度不同。人们也会尝试创建类似的用户名,所以它必须与那些匹配,这是困难的地方。
举个例子,如果我想让金毛猎犬成为一个保留的用户名。我也想让古尔登Reettreever被保留,因为他们显然是试图使一个名称是保留。
`
import re
username = "Stephen Jobless".lower()
reserved_name = "Steve Jobs".lower()
def regex_scour(reserved_name):
first_name, last_name = reserved_name.split()[0], reserved_name.split()[1]
#loop through username replacing one character with wildcard, returns match. Can be adjusted depending on how strict we want to
for i in range(len(first_name)):
sliced_name= first_name.replace(first_name[i], '')
pattern = re.compile(f"{sliced_name[:i]}.*{sliced_name[i:]}")
match = re.search(pattern, username)
sliced_name = first_name
try:
match = match.group()
except AttributeError:
continue
return match
for i in range(len(last_name)):
sliced_name= last_name.replace(last_name[i], '')
pattern = re.compile(f".*{sliced_name[:i]}.*{sliced_name[i:]}.*")
match = re.search(pattern, username)
sliced_name = last_name
try:
match = match.group()
except AttributeError:
continue
if match != None:
return match
else:
return match
print(regex_scour(reserved_name))
'这是我非常粗糙的代码,用来处理regex中运行不太好的部分。假设保留的名字是两个单词,中间用空格隔开。
我一直在尝试使用regex、difflib sequencematcher和groupby来创建一个函数,以删除重复的连续字符,它可以通过使用for循环来删除字符并将其替换为通配符来工作。但它很慢,很复杂,我只是想知道是否有更好的方法。
1条答案
按热度按时间14ifxucb1#
除了使用
in
函数从所有保留的用户名和它们的变体列表,你可能会考虑字符串相似性算法,它可以给每个字符串给予一个分数,并确定它是多么相似,你的关键字之一,通过一定的阈值(例如70%)。但我不认为这将阻止所有变体,因为你可以得到非常有创意的用户名。