加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python的Ruby String#succ的对应物?

发布时间:2020-12-20 13:39:00 所属栏目:Python 来源:网络整理
导读:我想知道在 python中是否有一个函数(或方法)增加字符串,如 Ruby的 String#succ方法,即: ~ $irb --simple-prompt '2'.succ= "3" '99'.succ= "100" 'zzz'.succ= "aaaa" 解决方法 以下实现是我可以通过ruby的String#succ实现得到的最接近的实现 def succ(s): i
我想知道在 python中是否有一个函数(或方法)增加字符串,如 Ruby的 String#succ方法,即:

~ $irb --simple-prompt
>> '2'.succ
=> "3"
>> '99'.succ
=> "100"
>> 'zzz'.succ
=> "aaaa"
>>

解决方法

以下实现是我可以通过ruby的String#succ实现得到的最接近的实现

def succ(s):
    if not isinstance(s,(str,string)):
        raise TypeError("succ works only with strings")
    if not s: return
    if max(map(ord,s)) > 127:
        raise TypeError("succ currently only supports ascii")

    #Three different character category honoured
    #  1. ascii lowercase alpha
    #  2. ascii uppercase alpha
    #  3. digits
    #  4. ascii nonalpha characters (the entire ascii set)
    lower = string.ascii_lowercase + 'a'
    upper = string.ascii_uppercase + 'A'
    digits = string.digits + '0'
    nonalpha = map(chr,range(0,256)) + [chr(0)]
    def incr(ch):
        '''
        Generates the next character in sequence using the following rules
            1. Incrementing a digit always results in another digit
            2. Incrementing a letter results in another letter of the same case.
            3. Incrementing nonalphanumerics uses the underlying
               character set’s collating sequence.
        '''
        if ch.isdigit(): return digits[ord(ch) - ord("0") + 1]
        if ch.islower(): return lower[ord(ch) - ord('a') + 1]
        if ch.isupper(): return upper[ord(ch) - ord('A') + 1]
        return nonalpha[ord(ch) + 1]
    def last(ch):
        '''
        Returns the last character in its catagory
        '''
        if ch.isdigit(): return digits[-2]
        if ch.islower(): return lower[-2]
        if ch.isupper(): return upper[-2]
        return nonalpha[-2]
    def first(ch):
        '''
        Returns the last first in its catagory
        '''
        if ch.isdigit(): return digits[0]
        if ch.islower(): return lower[0]
        if ch.isupper(): return upper[0]
        return nonalpha[0]
    def islast(ch):
        '''
        Checks if next increment would generate a carry
        '''
        return ch == last(ch)
    s = list(s)[::-1]
    carry = True
    try:
        index = next(i for i,e in enumerate(s) if e.isalnum())
    except StopIteration:
        index = 0
    while carry:

        if index == len(s): #Add a character for Overflow
            s.append(first(s[index - 1]))
            break
        carry =  True if islast(s[index]) else False
        s[index] = incr(s[index])
        index += 1
    return ''.join(s[::-1])

示例用法

succ('2')       - > 3         
succ('99')      - > 000       
succ('zzz')     - > aaaa      
succ('')        - > None      
succ('abcd')    - > abce      
succ('THX1138') - > THX1139   
succ('<<koala>>') - > <<koalb>> 
succ('1999zzz') - > 2000aaa   
succ('ZZZ9999') - > AAAA0000  
succ('***')     - > **+

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读