2012-02-23 2 views
0

У меня есть несколько строк с фразами или словами, разделенными несколькими пробелами.Как разбить эти строки на массивы строк?

c1 = "St. Louis  12    Cardinals" 
c2 = "Boston   16    Red Sox" 
c3 = "New York  13    Yankees" 

Как я пишу функцию, возможно, с помощью функции питона split(" "), чтобы отделить каждую строку в массив строк? Например, c1 будет идти до ['St. Louis', '12', 'Cardinals'].

Вызов split(" "), а затем обрезка компонентов компонента не будет работать, потому что некоторые объекты, такие как Сент-Луис или Ред Сокс, имеют в них пробелы.

Однако, я знаю, что все сущности имеют как минимум 2 пробела и что ни одна сущность не имеет в нем 2 пробела. Кстати, у меня на самом деле есть около 100 городов, чтобы иметь дело, а не 3. Спасибо!

+2

сделать regex split на '\ s {2,}' – mpen

+0

Спасибо, что такое разделение регулярных выражений? – dangerChihuahua007

+1

Являются ли значения фактически выстроенными таким образом? Действительно ли это промежутки между ними или вкладки? –

ответ

4

Без регулярных выражений:

c1 = "St. Louis  12    Cardinals" 
words = [w.strip() for w in c1.split(' ') if w] 
# words == ['St. Louis', '12', 'Cardinals'] 
+0

Спасибо! Это делает работу без загрузки модуля. – dangerChihuahua007

3
import re 
re.split(r' {2,}', c1) 
re.split(r' {2,}', c2) 
re.split(r' {2,}', c3) 
+0

Вау, спасибо, как это работает? Почему после запятой есть запятая? – dangerChihuahua007

+0

Это пример [регулярных выражений] (http://www.regular-expressions.info/), иначе известный как регулярное выражение (я предлагаю вам взглянуть!). Выражение говорит, что мы раскалываем: '{2,}' означает «два или более пробелов». Если бы мы написали '{2,5}', это означало бы от 2 до 5 пробелов - запятая оставит ее открытой. –

2

Вы можете сделать это с регулярными выражениями:

import re 

blahRegex = re.compile(r'(.*?)\s+(\d+)\s+(.*?)') 

for line in open('filename','ro').readlines(): 
    m = blahRegex.match(line) 
    if m is not None: 
     city = m.group(1) 
     rank = m.group(2) 
     team = m.group(3) 

Там много способов кожи, что кошки, вы можете использовать named groups, или сделать регулярное выражение туже .. Но это следует делать Это.

2

Вы можете использовать re.split

>>> re.split('\s{2,}','St. Louis  12    Cardinals') 
['St. Louis', '12', 'Cardinals'] 
2

Похоже, что содержание фиксированной ширины. Если это всегда так, и предполагая те пространства, а не вкладки, то вы всегда можете отменить его с помощью ломтиков:

split_fields = lambda s: [s[:16].strip(), s[16:31:].strip(), s[31:].strip()] 

или: использование

def split_fields(s): 
    return [s[:16].strip(), s[16:31:].strip(), s[31:].strip()] 

Пример:

>>> split_fields(c1) 
['St. Louis', '12', 'Cardinals'] 
>>> split_fields(c2) 
['Boston', '16', 'Red Sox'] 
>>> split_fields(c3) 
['New York', '13', 'Yankees'] 
Смежные вопросы