Python 诗词名句等转为便于记忆的密码

前言

在创建新账号时总会遇到密码问题,好记安全性又高的密码又不是很好想,很耽误时间,用诗词、名言警句或者座右铭啥的转成密码就很好记。在网上搜索合适诗句的时候,发现已经有人总结的比较全了 。于是参考着实现了一下,整个代码都很ez,可以自定义。


步骤很简单:

  1. 去除诗句中的标点
  2. 中文转拼音(基于xpinyin
  3. 取拼音首字母,并把行首的拼音首字母大写
  4. 特殊字符处理

代码

from xpinyin import Pinyin
# from icecream import ic

def Poetry_to_password(poetry):
    # 转拼音首字母
    p = Pinyin()
    py = p.get_initials(poetry, '')
    py = py.capitalize()


    # 找到非字母字符所在位置
    symbol = []
    for i, c in enumerate(py):
        if not c.isalpha():
            symbol.append(i)

    # 删除非字母字符
    if symbol:
        npy = py[:symbol[0]]
        npoetry = poetry[:symbol[0]]
        for i in range(1, len(symbol)):
            npy += py[symbol[i - 1] + 1:symbol[i]].capitalize()
            npoetry += poetry[symbol[i - 1] + 1:symbol[i]]
        npy += py[symbol[- 1] + 1:].capitalize()
        npoetry += poetry[symbol[- 1] + 1:]
    else:
        npy = py
        npoetry = poetry


    # 特殊字符识别处理
    password = Special_character(npoetry, npy)

    return password


def Special_character(npoetry, npy):
	# 特殊字符识别处理
    password = list(npy)
    p = Pinyin()
    py_all = p.get_pinyin(npoetry, tone_marks='marks')
    py_all = py_all.split('-')

    for i, y in enumerate(py_all):
        if y in ['líng', 'lín', 'lin', 'ling']:
            password[i] = '0'
        elif y in ['yī', 'yi']:
            password[i] = '1'
        elif y in ['èr', 'er']:
            password[i] = '2'
        elif y in ['sān', 'shān', 'san', 'shan']:
            password[i] = '3'
        elif y in ['sì', 'shì', 'si', 'shi']:
            password[i] = '4'
        elif y in ['wǔ', 'wú', 'wu', 'wǒ']:
            password[i] = '5'
        elif y in ['liù', 'niù']:
            password[i] = '6'
        elif y in ['qī', 'qi', 'xī', 'xi']:
            password[i] = '7'
        elif y in ['bā', 'ba']:
            password[i] = '8'
        elif y in ['jiǔ', 'jiu']:
            password[i] = '9'
        elif y in ['jiā']:
            password[i] = '+'
        elif y in ['jiǎn']:
            password[i] = '-'
        elif y in ['shù', 'sù']:
            password[i] = '|'

    for i, y in enumerate(npoetry):
        if y in ['云', '水', '雨', '风', '浪', '丝', '波']:
            password[i] = '~'
        elif y in ['未', '不', '惊', '叹', '无']:
            password[i] = '!'
        elif y in ['圈']:
            password[i] = '@'
        elif y in ['井', '网']:
            password[i] = '#'
        elif y in ['刀']:
            password[i] = '$'
        elif y in ['百', '白']:
            password[i] = '%'
        elif y in ['上', '高']:
            password[i] = '^'
        elif y in ['和', '兼', '且']:
            password[i] = '&'
        elif y in ['星', '乘', '日', '花', '雪']:
            password[i] = '*'
        elif y in ['下', '低', '底']:
            password[i] = '_'
        elif y in ['十']:
            password[i] = '+'
        elif y in ['等']:
            password[i] = '='
        elif y in ['大']:
            password[i] = '>'
        elif y in ['小']:
            password[i] = '<'
        elif y in ['斜', '除']:
            password[i] = '/'
        elif y in ['问', '谁', '孰', '何']:
            password[i] = '?'


    pw = ''
    for i, c in enumerate(password):
        pw += c
    return pw

效果

调用:
password = Poetry_to_password(poetry)
示例1'不到长城非好汉,屈指行程二万。' -> !dccfhhQzxc2w
示例2'晚来天欲雪,能饮一杯无?' -> Wlty*Ny1b!
示例3'万般皆是命,半点不由人。' -> Wbj4mBd!yr


链接

参考这篇文章实现,这篇文章总结挺全,想法也挺好,比如补刀和通过声调来解决没有特殊字符和数字的问题,很有意思。我没有完全照着实现,只实现了基本的转换,一般情况够用了。

文章:
https://github.com/bingoohuang/blog/issues/22
实现:
https://github.com/Anonymous772066235/LittleTasks/blob/main/Poetry_to_password

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值