正则表达式+ python挑战!几乎是常规的纠缠数据

时间:2013-02-22 22:40:56

标签: python regex

我很抱歉发布这个,但是我已经花了很多时间来解决这个问题。因此,正则表达式+ Python挑战一个和所有:

我正在使用大多数经常格式化的数据。公司名单合并为一个字符串,如

`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.']

在这种情况下你会做什么?

4 个答案:

答案 0 :(得分:5)

如果已知,您可以将拆分防止字符串添加到否定前瞻

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

答案 1 :(得分:1)

如果你可以建立一个可靠的非相关令牌列表,例如'Inc.','Inc'和'LLC',那么你可以用一种方法来解析Mike M的回应。即使这样,你可能也不会像split()那样自动为你工作。你可能不得不自己动手。

答案 2 :(得分:1)

我会在逗号上进行第一次拆分,以获得如下列表:

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

然后再次通过数据,其中“Inc”,“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)

如果您以后发现您的数据包含“Farmers Group,The”等条目并将文章放在正确的位置,此方法还可以让您进行更复杂的操作。

答案 3 :(得分:0)

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

您将不得不手动修复此问题,以便将数据质量恢复到其中。数据质量问题是计算机很难处理的事情之一。

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

完成后,您可以手动清理数据并重新处理。这是最好的赌注,当你能够证明将这些纠正措施作为你的计划的一部分时,这是最好的选择。但是,除非你是Google,否则几乎可以保证你会发现它最快,最容易让人眼睛看到它。