2017-01-09 3 views
0

Прежде всего, я приношу свои извинения за свои неопределенные вопросы, я просто не мог понять, что назвать этим вопросом. Я также искал google много, пытаясь найти решение, но я не пришел к выводу.Поиск постоянных номеров в 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] 

и мы можем сделать все это в эквиваленте для цикла:

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