2015-09-19 203 views
1

我想从数字,符号和字母组成的字符串中提取所有数字。 如果数字是多位数字,我必须将它们提取为多位数字(例如,从"shsgd89shs2011%%5swts"),我必须在数字出现时将其取出(89,20115)。 到目前为止,我所做的只是遍历并返回递增所有的数字,这是我喜欢,但有一组数字整理后,我无法弄清楚如何使之停止 :从正则表达式的字符串中提取数字

def StringThings(strng): 
     nums = [] 
     number = "" 
     for each in range(len(strng)): 
      if strng[each].isdigit(): 
       number += strng[each] 
      else: 
       continue 
      nums.append(number) 

     return nums 

运行此值: "6wtwyw66hgsgs"返回['6', '66', '666'] w 帽子简单的方法就是一旦我得到了我所需要的东西就会突破循环?

+0

您可以尝试使用的答案中选择[从字符串蟒蛇提取号码] [1] [1]类似的问题:http://stackoverflow.com/questions/4 289331/python-extract-numbers-from-a-string – TatiAuza

+0

感谢您的提示!但它并不适用于所有情况。 – Sina

回答

0

更新,考虑尾号:

def StringThings(strng): 
    nums = [] 
    number = "" 
    for each in range(len(strng)): 
     if strng[each].isdigit(): 
      number += strng[each] 

     if each == len(strng)-1: 
      if number != '': 
       nums.append(number) 

     if each != 0: 
      if strng[each].isdigit() == False: 
       if strng[each-1].isdigit(): 
        nums.append(number) 
        number = "" 
        continue; 
    return nums 

print StringThings("shsgd89shs2011%%5swts34"); 
// returns ['89', '2011', '5', '34'] 

所以,当我们到达一个特点,它已不是一个数字,如果先前观察到的字符是一个数,number内容附加到nums,然后只需清空我们的临时容器number,以避免它包含所有旧的东西。

请注意,我不知道Python,所以解决方案可能不是pythonic。

另外,保存自己所有的工作,只是做:

import re 
print re.findall(r'\d+', 'shsgd89shs2011%%5swts'); 
+0

谢谢,但我不允许使用re,而且我之前已经尝试过,并且在所有情况下都不起作用。例如“67gobbledegook95”返回“67”。 – Sina

+0

非常感谢。我有很多要学习的! – Sina

1

使用你的函数,只需使用一个临时变量Concat的数字每个序列,每次产生的群体你遇到一个非数字如果临时变量不为空字符串:

def string_things(strng): 
    temp = "" 
    for ele in strng: 
     if ele.isdigit(): 
      temp += ele 
     elif temp: # if we have a sequence 
      yield temp 
      temp = "" # reset temp 
    if temp: # catch ending sequence 
     yield temp 

输出

In [9]: s = "shsgd89shs2011%%5swts" 
In [10]: list(string_things(s)) 
Out[10]: ['89', '2011', '5'] 

In [11]: s ="67gobbledegook95" 
In [12]: list(string_things(s)) 
Out[12]: ['67', '95'] 

或者你可以翻译字符串用空格代替字母和标点符号再拆:

from string import ascii_letters, punctuation, maketrans 
s = "shsgd89shs2011%%5swts" 

replace = ascii_letters+punctuation 

tbl = maketrans(replace," " * len(replace)) 
print(s.translate(tbl).split()) 
['89', '2011', '5'] 
+1

哇。另一个好的解决方我一分钟都感到疲倦。第一次遇到“收益”。谢谢。 :-) – Sina

1
L2 = [] 
file_Name1 = 'shsgd89shs2011%%5swts' 
from itertools import groupby 
for k,g in groupby(file_Name1, str.isdigit): 
    a = list(g) 
    if k == 1: 
     L2.append("".join(a)) 

打印(L2)

结果[ '89', '2011', '5']

+0

谢谢!但是我根本不允许使用任何模块。 – Sina

+0

@Sina'我不允许使用任何模块'你在哪里写过这个?请在将来写出所有有问题的特殊条件(第一篇文章),以便人们不浪费时间。我整整一个小时为你找到答案。 –

+0

对不起,奥列格。但我在标题中没有提到正则表达式。我想这是没有足够的信息。感谢您的帮助,这对我来说仍然是非常有价值的信息。 – Sina