2013-02-14 3 views
0

Noob здесь пытается научиться python, выполняя проект, поскольку я не очень хорошо разбираюсь в книгах.Python - медленная скорость при извлечении чисел/слов из строки

Я использую огромный кусок кода, чтобы выполнить то, что мне кажется, что небольшая операция -

Я хочу, чтобы извлечь 4 переменные из следующей строки

'Miami 0, New England 28' 

(переменные будучи HOME_TEAM, away_team, home_score, away_score)

Моя программа работает довольно медленно, и я думаю, что это может быть этот бит кода. Думаю, я ищу самый быстрый/самый эффективный способ сделать это.

Реальное выражение будет быстрее? Спасибо

+4

Что немного кода? Вы не показали нам никакого кода. Можете ли вы опубликовать код, который вы используете, для анализа этого текста? – mgilson

+0

Да регулярные выражения очень быстрые. – eyquem

ответ

4

Кажется, что ваш текст можно разделить дважды. Сначала на , и затем на пробельных:

info1,info2 = s.split(',') 
home,home_score = info1.rsplit(None,1) 
away,away_score = info2.rsplit(None,1) 

т.д .:

>>> s = 'Miami 0, New England 28' 
>>> info1,info2 = s.split(',') 
>>> home,home_score = info1.rsplit(None,1) 
>>> away,away_score = info2.rsplit(None,1) 
>>> print [home,home_score,away,away_score] 
['Miami', '0', ' New England', '28'] 

Вы могли сделать это с помощью регулярных выражений без особых трудностей - но вы платите за это с точки зрения читаемости.

+0

Почему я такой тупой. Я потратил около 3 часов, думая, что мне нужно отделить цифры и текст, не понимая, что между ними есть пробелы. – user2073606

+0

@ user2073606 - Это было немного сложнее, чем я только что опубликовал. (Я забыл, что название команды также может иметь пробелы). Исправление состояло в 'rsplit' вместо' split' и только разрешить разделение строки один раз. – mgilson

+0

Думаю, вам следует разделить на '', '', потому что вам не нужно занимать ведущее место в названии пропущенной команды – Volatility

0

В случае, если вы хотите регулярное выражение:

import re 

s='Miami 0, New England 28' 
l=re.findall(r'^([^\d]+)\s(\d+)\s*,\s*([^\d]+)\s(\d+)',s) 
hm_team,away_team,hm_score,away_score=l[0] 

print l 

Печать [('Miami', '0', 'New England', '28')] и присваивает эти значения переменным.

+1

' '[^ \ d]' 'это' '\ D''! – eyquem

+0

, следовательно, аргумент правдоподобия ... – Greg

0
import re 

reg = re.compile('\s*(\D+?)\s*(\d+)' 
       '[,;:.#[email protected]\s]*' 
       '(\D+?)\s*(\d+)' 
       '\s*') 

for s in ('Miami 0, New England 28', 
      'Miami0,New England28 ', 
      ' Miami 0 . New England28', 
      'Miami 0 ; New England 28', 
      'Miami0#New England28 ', 
      ' Miami 0 @ New England28'): 

    print reg.search(s).groups() 

результат

('Miami', '0', 'New England', '28') 
('Miami', '0', 'New England', '28') 
('Miami', '0', 'New England', '28') 
('Miami', '0', 'New England', '28') 
('Miami', '0', 'New England', '28') 
('Miami', '0', 'New England', '28') 

'\D' означает 'нет' цифры

Смежные вопросы