2013-02-22 44 views
2

我很抱歉发布这个,但我已经杀了很多时间来处理这个失败。所以,一个和所有的正则表达式+ Python挑战:正则表达式+ python挑战! Wrangling的数据几乎是正常的

我正在处理大部分经常格式化的数据。公司列表被合并为一个字符串,如

`Company Inc,Company, LLC,Company` 

没有引号来划定条目。使用常规的,上面的例子中,我可以这样做:

>>> re.split(r',\b', 'Company Inc,Company, LLC,Company')                                              
['Company Inc', 'Company, LLC', 'Company'] 

不幸的是,某些字符串被不规则格式,如:

`IBP, Inc,Tyson Foods,Inc.` 

其中,Inc不是由空间从Foods分离。因此,使用r',\b',我得到这个:

>>> re.split(r',\b', 'IBP, Inc,Tyson Foods,Inc.') 
['IBP, Inc', 'Tyson Foods', 'Inc.'] 

我希望得到这样的:

['IBP, Inc', 'Tyson Foods,Inc.'] 

,你会在这种情况下怎么办?

+1

使用ms excel来纠缠它 – 2013-02-22 22:45:34

+1

您的规则没有明确定义 - 这是不可能的。 'Inc.,LLC,Inc.'应该如何解析? ' '公司', '有限责任公司','Inc.''? ' '公司,有限责任公司',“Inc.''? ''Inc.','LLC,Inc.''?你用人类的直觉和经验去分裂这些名字。直到你可以将你的直觉表达为一系列规则,正则表达式不会对你有所帮助。 – Eric 2013-02-22 22:48:52

+1

老实说?我可能会用逗号分割整个事物,然后将'Inc [。]','LLC'等特殊情况合并回来,假设它总是'Company Name [,] SomethingSpecial'。你希望'c,Comp'在逗号上分割,但是'Inc''不要,我不能看到没有特殊框架会发生什么。也可以明确说明它。 – DSM 2013-02-22 22:49:24

回答

5

如果知道的话,你可以在拆分预防字符串添加到负前瞻

r',\b(?!Inc\.)' 
+0

这很好,谢谢。现在我需要查看这个语法来了解它是如何工作的! – 2013-02-23 23:14:11

+0

但是,再次感谢您回答这个问题。这正是我正在寻找的。因此,许多人要么就住在我的问题的开放性问题上(尽管我试图以获得您提供的答复的方式提问),或者试图告诉我不要使用正则表达式。除了Excel以外,有些人试图将我指向Parsley(解析器)等东西。我很欣赏你看到我的问题,因为我试图提出它,并且提供我正在寻找的响应 – 2013-02-24 22:49:40

0

这取决于你必须弄清楚的条目数量。基本上,就高质量的数据而言,你被搞砸了。这意味着您尝试应用的任何自动化都会在处理数据时遇到问题。

您将不得不手动修复此问题,以将数据质量重新添加到其中。数据质量问题是计算机处理非常困难的事情之一。

我个人会做的是写一个快速和肮脏的启发式,以尝试确定不符合预期结果的条目。例如,在您的示例中,我会查找“Inc”或“LLC”加上或减去几个字符的拆分条目。那会得到似乎不能提供高于公司类型的条目。你会赶上“公司”并且知道真实公司名称必须在附近。

一旦你有了,你可以手工清理你的数据,并重新处理。这是最好的赌注,当你可以证明这些纠正措施是你程序的一部分时,这是最好的。但是,除非你是谷歌,否则几乎可以保证你会发现它最快最容易让人眼前一亮。

1

摆在条款略有不同迈克M的反应,如果你能建立非相关令牌像“的可靠清单Inc.','Inc'和'LLC',那么你可能有办法解析。即使那样,你可能也不会像split()那样自动获取某些东西来为你工作。你可能不得不推出自己的。

+0

是的,可怕的。说实话,我宁愿在这部分程序中分裂成复杂的程序。当谈到这种类型的代码时,我并不是一个好的程序员,所以我自己的解析mumbo jumbo会快速失控。 – 2013-02-23 23:18:59

1

我会做的第一分割上逗号获得列表,如:

['IBP', 'Inc', 'Tyson Foods', 'Inc.'] 

,然后通过数据做了第二次,其中极不可能的公司名称,如“公司”,“公司” ,'LLC','GmbH'等。得到与列表中的前项合并:

badList = originalData.split(',') 
goodList = [] 
rejectList = ['Inc', 'Inc.', 'LLC', 'GmbH'] # etc. 

for pseudoName in badList: 
    pseudoName = pseudoName.strip() 
    if pseudoName in rejectList: 
     goodList[-1] = goodList[-1] + ", " + pseudoName 
    else: 
     goodList.append(pseudoName) 

这种方法也会让你做更复杂的操作,如果你后来发现你的数据有条目,如“农民集团的”,并把在文章正确的位置。

+1

谢谢Michael! – 2013-02-24 23:01:38