2013-02-14 51 views
0

Noob here试图通过做一个项目来学习python,因为我没有很好地从书本中学习。Python - 从字符串中提取数字/单词时速度慢

我使用的代码一个巨大的肿块执行什么,在我看来是一个小操作 -

我想从以下字符串

'Miami 0, New England 28' 

(变量是HOME_TEAM提取4个变量, away_team,home_score,away_score)

我的程序运行速度很慢,我认为这可能是这段代码。我想我正在寻找这样做的最快/最有效的方法。

正则表达式会更快吗?谢谢

+4

什么的代码位?你没有在那里向我们展示过任何代码。你能发布你用来解析文本的代码吗? – mgilson 2013-02-14 22:38:30

+0

是的正则表达式非常快。 – eyquem 2013-02-14 23:25:18

回答

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 2013-02-14 22:43:19

+0

@ user2073606 - 比我刚发布的稍微复杂一些。 (我忘了团队名称也可以有空格)。解决方法是'rsplit'而不是'split',只允许字符串被分割一次。 – mgilson 2013-02-14 22:44:41

+0

我认为你应该分开'','',因为你不想在客队的名字中领先空间 – Volatility 2013-02-14 22:46:28

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 2013-02-14 23:26:12

+0

因此可靠性参数... – Greg 2013-02-15 00:01:46

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'意味着 '无位'