2011-11-17 163 views
5

的第三次出现后,我想第三个字符之后剥离所有的字符,比如 - 例如。地带串字符蟒蛇

我发现这个代码在网上和它的作品,但我有麻烦学习它是如何工作的,并要问,所以我可以完全理解。

def indexList(s, item, i=0): 
    """ 
    Return an index list of all occurrances of 'item' in string/list 's'. 
    Optional start search position 'i' 
    """ 
    i_list = [] 
    while True: 
     try: 
      i = s.index(item, i) 
      i_list.append(i) 
      i += 1 
     except: 
      break 
    return i_list 

def strip_chrs(s, subs): 
    for i in range(indexList(s, subs)[-1], len(s)): 
     if s[i+1].isalpha(): 
      return data[:i+1] 

data = '115Z2113-3-777-55789ABC7777' 
print strip_chrs(data, '-') 

这里是我的问题 上,而真:线什么是真的吗? 另外除了:除了什么?为什么会在那里编码?

在此先感谢!

+0

为什么你标记这个Python 3.x?您在'print'语句中使用Python 2.x语法。 –

+0

你是否想在第三次出现另一个人之后去除所有人物?因此,在你的'data'例子中,你是否试图在'115Z2113-3-777'之后去掉所有的东西? – Casey

+0

是的,55789ABC7777应该被剥离。我标记了Python 3.x,因为我目前正在学习它。我会删除标签,尽管我很抱歉 – canyon289

回答

22

这里有一个办法:

def trunc_at(s, d, n=3): 
    "Returns s truncated at the n'th (3rd by default) occurrence of the delimiter, d." 
    return d.join(s.split(d, n)[:n]) 

print trunc_at("115Z2113-3-777-55789ABC7777", "-") 

它是如何工作的:

  1. 字符串s被分成每一个列表使用s.split(d)时出现分隔符d。我们使用的第二个参数split指示分裂的最大数量做(因为没有理由继续分裂第一n次后)。其结果是一个列表,如["115Z2113", "3", "777", "55789ABC7777"]
  2. 第一n项列表的的切片使用[:n]服用。其结果是另一个列表,如["115Z2113", "3", "777"]
  3. 清单加入回字符串,将分隔符d列表中的每个项目之间,使用d.join(...),导致,例如,"115Z2113-3-777"
+0

我喜欢。 愚蠢的长度限制。 –

+0

为简单起见,+1为不使用itertools :) –

4

线

while True: 

创建无限循环。它会一直循环,直到程序崩溃或调用breakexcept行是一个异常处理程序,它将捕获任何异常,此时break被称为退出无限循环。

1

在 “真时”,真正是简单常数值true。所以虽然True是永久循环或直到破碎。

的,除了使用异常时s.index后,我发现没有更多的字符串,以此来打破循环出现这种情况。这是一件坏事。

尝试这样的事情(伪):

while you still have string left: 
    get index of next '-' 
    if found, add 1 to count 
    if count == 3: 
     return s[index+1:] 

s[index+1:]收益从以下索引字符的字符串,到最后。

7

在一个班轮方式:

data = '115Z2113-3-777-55789ABC7777' 
strip_character = "-" 
>>> strip_character.join(data.split(strip_character)[:3]) 
'115Z2113-3-777'