python将字符串解析为单个字符

时间:2014-12-18 05:35:03

标签: python string parsing format character

在Python 2.7中,如何将'abc'解析为'a b c'中的一个很长的字符串(如1000个字符)?

或者我如何将'abccda'转换为'1 2 3 3 4 1'? (每个独特的字母映射到一个唯一的数字,1-4)

我想我可以一个接一个地弹出这些字符,但我是Python的新手,并想知道是否有一个简单的函数可以实现它。

4 个答案:

答案 0 :(得分:3)

对于第一个使用join()

>>> s = 'abc'
>>> ' '.join(s)
'a b c'

对于第二个:

>>> s = 'abccda'
>>> ' '.join(chr(ord(c)-ord('a')+ord('1')) for c in s)
'1 2 3 3 4 1'

或者您可以简单地使用字典将字母映射到数字:

>>> s = 'abccda'
>>> d = dict(a=1, b=2, c=3, d=4)
>>> ' '.join(str(d[c]) for c in s)
'1 2 3 3 4 1'

另一种方法是使用string.translate()

>>> from string import maketrans
>>> s = 'abccda'
>>> ' '.join(s.translate(maketrans('abcd', '1234')))
'1 2 3 3 4 1'

translate()将是首选的,因为与天真的字典查找相反,它处理未映射的字符而没有错误:

>>> s='abcdefgh'
>>> ' '.join(s.translate(maketrans('abcd', '1234')))
'1 2 3 4 e f g h'

答案 1 :(得分:1)

x="abc"
print re.sub(r"(?<!^)(.)",r" \1",x)

对于简单转换,您可以尝试此操作。对于映射,您可以在repl中定义re.sub函数。示例可以是

def repl(matchobj):
    if matchobj.group()=='b':
         return " "+str(1)
    elif matchobj.group()=='c':
         return " "+str(2)
x="abc"
print re.sub(r"(?<!^)(.)",repl,x)

答案 2 :(得分:1)

你的意思是列表方法吗?

S = 'abccda'

list(s)#['a','b','c','c','d','a']

答案 3 :(得分:1)

要将每个字母转换为数字,您可以使用str.translate。在这个简单的案例中,这可能有点过头了,但值得学习。

Python 2和Python 3中的细节不同。

对于Python 3,您可以使用从Unicode序列到替换字符串的映射,如下所示:

mapping = {ord(letter): str(number) for number, letter in enumerate(string.ascii_lowercase[:4], 1)}
translated = x.translate(mapping)

对于Python 2,你需要一个特殊的转换表,在这种情况下它不太方便(并且只允许你将字符翻译成单个字符,而不是像Python 3版本那样的任意字符串 - 这里不是问题,但是,如果您想将'j'转换为'10,那么它将不起作用):

mapping = string.maketrans(string.ascii_lowercase[:4], 
                           ''.join(str(i) for i in range(1, 5))
translated = x.translate(mapping)

然后,要添加空格,请使用mhawke's solution

result = ' '.join(translated)