用Python方式在不同位置连接字符串

时间:2018-09-11 02:01:26

标签: python python-3.x

我有一个包含数字的字符串。字符串需要用3的块分隔数字。如有必要,最后一个块或最后两个块可以包含2个数字(但绝不能包含1个数字)。

示例:

"123456789" -> "123-456-789"
"1234567891" -> "123-456-78-91"
"12345678912" -> "123-456-789-12"

直接处理三个部分是很简单的:

'-'.join(S[i:i+3] for i in range(0, len(S),3))

我该如何扩展?

4 个答案:

答案 0 :(得分:1)

描述状况的另一种方法是:“将所有内容分成三块。如果最后一块具有一个元素,则从该块中抢出一个。” textwrap.wrap提供了一个很好的工具来分解字符串:

from textwrap import wrap

pieces = wrap(S, 3)
if len(pieces[-1]) == 1:
    pieces [-2:] = pieces[-2][:-1], pieces[-2][-1] + pieces[-1]
result = '-'.join(pieces)

答案 1 :(得分:0)

result = '-'.join(S[i:i+3] for i in range(0, len(S),3)) if len(S)%3 != 1 else '-'.join([S[i:i+3] for i in range(0, len(S)-4, 3)] + [S[-4:-2], S[-2:]])

答案 2 :(得分:0)

使用正则表达式可以最轻松地解决此问题。您可以将re.findall与以下正则表达式一起使用,以找到字符串末尾的一组或两组两位数或其他位置的三位数字,然后将非空组与'-'结合使用,生成器表达式:

import re
def format_phone_number(s):
    return '-'.join(i for t in re.findall(r'(\d{2})(\d{2})?$|(\d{3})', s) for i in t if i)

这样:

print(format_phone_number('123456789'))
print(format_phone_number('1234567891'))
print(format_phone_number('12345678912'))

将输出:

123-456-789
123-456-78-91
123-456-789-12

答案 3 :(得分:0)

我编写了一个简单易懂的程序来解决此问题。您可以按照以下方式进行操作:

def SeparateNum(S):

    l=len(S)
    S0=""
    rem=l%3

    if rem==0:
        for i in range(l):
            if i%3==0 and i!=0:
                S0=S0+"-"
            S0=S0+S[i]
    elif rem==1:
        for i in range(l-4):
            if i%3==0 and i!=0:
                S0=S0+"-"
            S0=S0+S[i]
        S0=S0+"-"+S[l-4]+S[l-3]+"-"+S[l-2]+S[l-1]
    elif rem==2:
        for i in range(l-2):
            if i%3==0 and i!=0:
                S0=S0+"-"
            S0=S0+S[i]
        S0=S0+"-"+S[l-2]+S[l-1]
    return S0

print(SeparateNum("12345678987"))
print(SeparateNum("123456789"))
print(SeparateNum("1234567898"))