2017-06-04 27 views
0

比方说,我有这个字符串'foo1bar2xyz'将字符串拆分为文本和数字?

我知道数字索引以它{'1': 3, '2': 7}

我想形成不具有数字父串子。我将如何获得删除特定索引的字符串的子字符串?

其中在上述情况下,这将是['foo', 'bar', 'xyz']

是否尝试过这个至今

def iterate_string(og_string, start, stop): 
    if start == 0: 
     return og_string[:stop] 
    else: 
     return og_string[start+1:stop] 

def ret_string(S): 
    digit_dict = {c:i for i,c in enumerate(S) if c.isdigit()} 
    digit_positions = list(digit_dict.values()) 
    # return digit_positions 
    substrings = [] 
    start_index = 0 
    for position in digit_positions: 
     p = iterate_string(S, start_index, position) 
     substrings.append(p) 
     start_index = position 

    return substrings 


print ret_string('foo1bar2xyz') 

但这返回['foo', 'bar']

相关SOquestions

+0

的[如何分割字符串转换为文本和数字可能重复? ](https://stackoverflow.com/questions/430079/how-to-split-strings-into-text-and-number) –

+0

在你的代码中,除非最后一个字符是数字,否则不会得到期望的输出。如果start_index是最后一个索引,则必须检查for循环。如果不附加'S [start_index + 1:]'。但是,如果最后一个字符是数字,您可能需要考虑回答 – kuro

回答

2

试试这个:

l = re.compile("[0-9]").split(s) 
4

可以使用RE做

import re 
h = "foo1bar2xyz" 
l = re.compile("\d").split(h) 

输出:

['foo', 'bar', 'xyz'] 
2

如果有指数,并希望作为输入使用,那么这是一个好主意太:

def split_by_indices(s, indices): 
    ends = sorted(indices.values()) # we only need the positions 
    ends.append(len(s)) 
    substrings = [] 
    start = 0 
    for end in ends: 
     substrings.append(s[start:end]) 
     start = end + 1 
    return substrings 

演示:

>>> split_by_indices('foo1bar2xyz', {'1': 3, '2': 7}) 
['foo', 'bar', 'xyz'] 

忽略输入字符串任何实际的数值,并从你的字典里只有使用[3, 7]位置。

但是,如果你正在构建{'1': 3, '2': 7}地图只是分割你的字符串,它可能是更容易,只需使用正则表达式:

import re 

split_by_digits = re.compile(r'\d').split 
result = split_by_digits(inputstring) 
+0

中描述的方式,第一种方法将在输出 – kuro

+0

@kuro中给出一个空字符串:另一种方法也是如此。这取决于你的用例,如果这需要或不。 –