2017-01-09 55 views
0

首先,我爲我模糊的問題框架表示歉意,我無法弄清楚該怎麼稱呼這個問題。我也搜索了很多谷歌試圖找到解決方案,但我沒有得出任何結論。在Python中查找持續數字

我目前有一個像這樣的數字整個字符串15-5.{123434}.15-18.。我想遍歷字符串,只要遇到一個開放的大括號,我想在遇到一個右大括號之前將所有數字都取出,並將它們放入一個變量中。我想過這樣做的方式,像這樣:

string = '15-5.{123434}.15-18.' 
result = "" 

for index, letter in enumerate(string): # For every letter with it's index, 
    if letter == '{': # If letter is '{', 
     for number in string[index:]: # Start a loop from that index, 
      if number =='}': # If number becomes '}', 
       break 
      result += number #Else append the number in the result string. 

但是,我想知道是否有更好的方法來做到這一點。我讚賞所有的答案。謝謝!

 
System: Windows 10, 32bit 
Python version: 3.6.0 
+2

使用正則表達式嗎? –

+0

你是否熟悉正則表達式?他們使這是一個微不足道的問題。 –

+0

我正在考慮使用正則表達式,但我不太瞭解它們,我不知道是否應該使用re.search(),re.match()或其他合適的選項。 – Frixoe

回答

4

這是爲數不多的幾次我給你推薦一個正則表達式:

In [27]: for i in re.findall("\{\d+\}", '15-5.{123434}.15-18.'): print(i[1:-1]) 
123434 

當然,你可以寫一個函數來自己解析它:

def getNums(s): 
    answer = [] 
    curr = [] 
    acc = False 
    for char in s: 
     if char == "{": 
      acc = True 
      continue 
     if char == "}": 
      acc = False 
      answer.append(''.join(curr)) 
      acc = False 
      continue 
     if acc: 
      curr.append(char) 
+0

哦!我以爲我可以用正則表達式解決它,但不知道使用哪一個,非常感謝!但我不明白你爲什麼使用'In' thingy – Frixoe

+1

@Frixoe:'In' thingy只是我的Python終端。不要擔心:) – inspectorG4dget

+1

@Frixoe你可以忽略它。這只是其中一個Python終端的提示 –

1

不敲門一個正則表達式,但我認爲我發現了另一個與.split()的單線程

[e.split('}')[0] for e in s.split('{') if '}' in e] 

測試:

ss = ['','{}','{0}','1','{0}1','1{0}','{0}{2}','{0}1{2}','{0}1{2}3']      

for s in ss:      
    print(s,[e.split('}')[0] for e in s.split('{') if '}' in e]) 
[] 
{} [''] 
{0} ['0'] 
1 [] 
{0}1 ['0'] 
1{0} ['0'] 
{0}{2} ['0', '2'] 
{0}1{2} ['0', '2'] 
{0}1{2}3 ['0', '2'] 

編輯對列表內涵擴大

大量信息對列表解析可用,http://treyhunner.com/2015/12/python-list-comprehensions-now-in-color/是非常基本的,有足夠的瞭解我的答案的列表理解

我們可以重寫理解帶有可能幫助閱讀的部分之間的換行符:

c = [e.split('}')[0] 
      for e in s.split('{') 
       if '}' in e] 

,我們可以做整個事情在等效的for循環:

def in_curly(s):  
    new_list = [] 
    for e in s.split('{'): 
     if '}' in e: 
      new_list.append(e.split('}')[0]) 
    return new_list 

c = in_curly(s) 

有說:

s ='35{0}17{2}3' 

的一種或兩種以上可以通過http://pythontutor.com現場執行可視化模式

踩踏
+0

我不太明白。對不起,我對理解比較陌生,所以單線看起來很混亂。 – Frixoe

+0

增加了一點理解列表理解 – f5r5e5d

+0

謝謝!我理解了理解! :d – Frixoe