检查字符串是否是名称的缩写

Bjö*_*ist 11 python text-analysis abbreviation string-matching slug

我正在尝试开发一个python算法来检查字符串是否可以是另一个单词的缩写.例如

  • fck是匹配fc kopenhavn因为它匹配单词的第一个字符.fhk不匹配.
  • fco不应该匹配,fc kopenhavn因为没有人会将FC Kopenhavn缩写为FCO.
  • irl是匹配的in real life.
  • ifk是匹配的ifk goteborg.
  • aik是匹配的allmanna idrottskluben.
  • aid是匹配的allmanna idrottsklubben.这不是一个真正的团队名称缩写,但我想除非您应用有关如何形成瑞典语缩写的领域特定知识,否则很难将其排除.
  • manu是匹配的manchester united.

很难描述算法的确切规则,但我希望我的例子能说明我所追求的内容.

更新我在显示匹配字母大写的字符串时犯了一个错误.在实际场景中,所有字母都是小写的,因此它不像检查哪些字母是大写的那么容易.

unu*_*tbu 12

这通过了所有测试,包括我创建的一些额外测试.它使用递归.以下是我使用的规则:

  • 缩写的第一个字母必须与文本的第一个字母相匹配
  • 其余缩写(缩写减去第一个字母)必须是以下缩写:

    • 剩下的话,或者
    • 剩下的文字从第一个单词的任何位置开始 .

tests=(
    ('fck','fc kopenhavn',True),
    ('fco','fc kopenhavn',False),
    ('irl','in real life',True),
    ('irnl','in real life',False),    
    ('ifk','ifk gotebork',True),   
    ('ifko','ifk gotebork',False),    
    ('aik','allmanna idrottskluben',True),
    ('aid','allmanna idrottskluben',True),
    ('manu','manchester united',True), 
    ('fz','faz zoo',True), 
    ('fzz','faz zoo',True),
    ('fzzz','faz zoo',False),    
    )

def is_abbrev(abbrev, text):
    abbrev=abbrev.lower()
    text=text.lower()
    words=text.split()
    if not abbrev:
        return True
    if abbrev and not text:
        return False
    if abbrev[0]!=text[0]:
        return False
    else:
        return (is_abbrev(abbrev[1:],' '.join(words[1:])) or
                any(is_abbrev(abbrev[1:],text[i+1:])
                    for i in range(len(words[0]))))

for abbrev,text,answer in tests:
    result=is_abbrev(abbrev,text)
    print(abbrev,text,result,answer)
    assert result==answer
Run Code Online (Sandbox Code Playgroud)