2010-08-31 36 views
3

我想从一些字符串捕获/提取数值。调整Python的正则表达式不包括一个数字在findall结果

下面是一个简单的字符串:

s='The shipping company had 93,999,888.5685 gallons of fuel on hand' 

我想拉93,999,888.5685值 我已经得到了我的正则表达式来此

> mine=re.compile("(\d{1,3}([,\d{3}])*[.\d+]*)") 

然而,当我做的findall我得到以下:

mine.findall(s) 

[('93,999,888.5685', '8')] 

我试过了很多不同的策略来保留它从8

匹配的但是我现在意识到,我不知道我知道它为什么在8

任何照明,将不胜感激匹配。

回答

4

8被捕获的原因是因为你有2个捕获组。将第二组标记为非捕获组,使用?:用以下模式:(\d{1,3}(?:[,\d{3}])*[.\d+]*)

您的第二组([,\d{3}])负责进行其他匹配。

+0

非常感谢,现在我需要弄清楚捕获与非捕获组。但我会和这个答案将帮助我到达那里。 – PyNEwbie 2010-08-31 20:12:06

+0

@PyNEwbie这个想法是你的模式必须与整体匹配,但括号内的任何东西()都是一个捕获组。有时你需要在你的模式中使用组,但最终你并不在意捕捉它们,只是匹配它们。在这些情况下,您可以将它们标记为未捕获。另一种方法是使用命名组,并从您感兴趣的命名组中提取值。有关更多信息,请参阅http://docs.python.org/library/re.html。 – 2010-08-31 20:16:17

1

你的字符串分解:

(
\d{1,3}  This will match any group of 1-3 digits (`8`, `12`, `000`, etc) 
    (
    [,\d{3}] This will match groups of a "," and 3 digits (`,123`, `,000`, etc) 
)*   **from zero to infinity times** 
    [.\d+]*  This matches any number of periods "." and digits from 0 to infinity 
) 
-1

为什么不\ d换呢? mine=re.compile("\D(\d{1,3}([,\d{3}])[.\d+])\D")

+0

你测试了这个吗?我得到更多的垃圾 – PyNEwbie 2010-08-31 20:08:39

0

findall为每个匹配返回一个元组。该元组包含匹配的每个组(由正则表达式中的括号描绘)。你只需要第一组。下面我用列表理解来拉出第一组。

>>> mine=re.compile("(\d{1,3}(,\d{3})*(\.?\d+)*)") 
>>> s='blah 93,999,888.5685 blah blah blah 988,122.3.' 
>>> [m[0] for m in mine.findall(s)] 
['93,999,888.5685', '988,122.3']