【问题标题】:Regular Expression Get Computer Specs from Plain Text正则表达式从纯文本中获取计算机规格
【发布时间】:2014-01-14 21:20:03
【问题描述】:

我有一个数据集,其中包含纯文本、关于计算机的描述,它们如下所示:

我正在尝试根据文本预测价格,这是我的方法。 由于我知道它们都是计算机,所以我会尝试使用正则表达式来解析出 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,我认为这可能是一个非常笼统的统计问题,即“如何根据词袋做出预测”.. 如果有人能指出更好的方法,那将不胜感激!

【问题讨论】:

  • (?i)[\d.]+\s*(?:ghz|gigaHerz) 怎么样?或[\d.]+\s*(?i:ghz|gigaHerz)

标签: python regex r


【解决方案1】:

试试正则表达式

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

你可以找到演示和解释here

【讨论】:

  • 这是一个非常漂亮的网站!
【解决方案2】:

正则表达式不适合处理杂乱的数据。像http://openrefine.org/ 这样的东西更适合这个任务。

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

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

【讨论】:

    【解决方案3】:

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

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

    也匹配“千兆赫”:

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

    【讨论】:

    • @thefourtheye 这到底是什么意思?我认为1.1.1 GHz 不会出现在数据集中,因为这没有任何意义。
    • @thefourtheye 好吧,当然,但正则表达式并不是一个防错字的解决方案。如果数据中的一行读取1,1 GHz 怎么办?或者1.1 GНz(其中“H”实际上是西里尔字母“Н”,U+041D)?坦率地说,我认为仅使用正则表达式无法获得强大的解决方案。 (即使试图靠近也会给你留下一个难以理解的怪物,无论如何这可能会搞砸边缘情况。)
    • 同意 :) 感谢您的解释 :)
    【解决方案4】:

    试试这个频率:

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

    一些注意事项: 这 ”\。”与实际期间相符。一种 '。'本身匹配单个字符。 “*”匹配 0 个或多个空格字符。 [gG][hH][zZ] 匹配字母“g”、“h”和“z”的任意组合,大小写。

    【讨论】:

      【解决方案5】:

      尝试做:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多