regex Python正则表达式与可变模式,模式长度?

qpgpyjmq  于 2022-11-18  发布在  Python
关注(0)|答案(1)|浏览(140)

我正在尝试开发一个函数,该函数从用户获取一个名称,并尝试将该名称与一个任意保留的用户名数据库进行匹配。(保留名称)是可变长度的,用户名可以是任何内容。我试图防止用户使用基本上保留的用户名,但用户名的长度不同。人们也会尝试创建类似的用户名,所以它必须与那些匹配,这是困难的地方。
举个例子,如果我想让金毛猎犬成为一个保留的用户名。我也想让古尔登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循环来删除字符并将其替换为通配符来工作。但它很慢,很复杂,我只是想知道是否有更好的方法。

14ifxucb

14ifxucb1#

除了使用in函数从所有保留的用户名和它们的变体列表,你可能会考虑字符串相似性算法,它可以给每个字符串给予一个分数,并确定它是多么相似,你的关键字之一,通过一定的阈值(例如70%)。但我不认为这将阻止所有变体,因为你可以得到非常有创意的用户名。

相关问题