正则表达式从纯文本获取计算机规范

时间:2014-01-14 21:20:03

标签: python regex r

我有一个包含纯文本的数据集,有关计算机的描述,它们看起来类似如下:

enter image description here

我试图根据文本预测价格,这是我的方法。 因为我知道它们都是计算机,所以我将尝试使用正则表达式来解析CPU频率,内存,磁盘容量和屏幕大小等等。所以你将拥有一个具有固定列数的矩阵......你可以运行常规算法来预测价格(随机森林,线性回归......)。

然而,我遇到了解析列的正则表达式部分: 假设我正在尝试解析文本中的频率,我想它将是一些数字后跟“GHz”。

>>> re.findall(re.compile('([.\d]+) GHz'), '2.2 GHz 32 GB')
['2.2']

这很好,然而事实证明正则表达式不是那么好。以下是我的正则表达式失败的一些条件:

>>> re.findall(re.compile('([.\d]+) GHz'), '2.2 ghz 32 GB')
[]
>>> re.findall(re.compile('([.\d]+) GHz'), '2.2 Ghz 32 GB')
[]
>>> re.findall(re.compile('([.\d]+) GHz'), '2.2GHz 32 GB')
[]

我对正则表达式不太好,我想知道有人能告诉我如何找到“ghz”或“gigaHerz”之后的数字......并且可能会有一些空格数量和度量单位。

PS:我知道R和我认为可能是一个非常普遍的统计问题“如何基于词袋做出预测”......如果有人能指出我更好的方法,那将不胜感激!

5 个答案:

答案 0 :(得分:4)

试试正则表达式

(\d+(?:\.\d+)?) ?[Gg](?:iga)?[Hh](?:ert)?[Zz]

您可以找到演示和解释here

答案 1 :(得分:3)

正则表达式不适合处理凌乱的数据。类似http://openrefine.org/之类的东西更适合这项任务。

使用RegExp快速而肮脏的启发式算法可以很好地衡量您的数据,如:

re.findall(re.compile('([\.\d]+) ?g[^\W\d]*z', re.IGNORECASE), '2.2 gigahERTz 32 GB')

答案 2 :(得分:1)

尝试以下频率:

re.findall(re.compile('([\.\d]+) *[gG][hH][zZ]'), '2.2 GHz 32 GB')

一些说明: “\。”匹配实际的时期。一个 '。'本身匹配单个字符。 “*”匹配0个或更多空格字符。 [gG] [hH] [zZ]匹配字母'g','h'和'z'的任意组合,大写和小写。

答案 3 :(得分:1)

您需要不区分大小写的正则表达式。此外,通过在空格后添加?,它可以匹配空格零次或一次。

>>> re.findall(re.compile('([\.\d]+) ?GHz', re.IGNORECASE), '2.2 ghz 32 GB')
['2.2']

还要匹配“gigahertz”:

>>> re.findall(re.compile('([\.\d]+) ?G(?:iga)?H(?:ert)?z', re.IGNORECASE), '2.2 gigahERTz 32 GB')
['2.2']

答案 4 :(得分:1)

尝试做:

re.findall("[0-9]+).*?[gG][hH][zZ]", "some text")