【问题标题】:Cleansing company names with regex用正则表达式清理公司名称
【发布时间】:2014-03-21 06:14:09
【问题描述】:

我有一个数据集 (postgresql),其中一个字段包含逗号分隔的公司名称。大多数公司名称由常规字符(字母数字 + 空格)组成,但也有一些带有后缀,例如“, inc”。或“有限公司”。为了将公司名称拆分为单独的字符串,我需要先删除用于表示公司名称后缀的逗号(这是外部要求)。所以,例如在

Burn To Ground、Groupwise, Ltd.、People, Inc.、SepiaShot

我的正则表达式应该能够删除第二个和第四个逗号,但不能删除其他逗号。我想知道这是否可以使用正则表达式来完成。我尝试了几种使用平衡组和环视的解决方案,但我无法成功。

【问题讨论】:

  • 只有当你有一组特定的词可以作为允许的后缀时才有可能。除了这些以外,这里还有 Ltd. 和 Inc. 字样?
  • 这是dba.stackexchange.com/q/55871/7788 和相关的另一个示例,即“不要将逗号分隔的文本存储在数据库中”。
  • 郑重声明:我也没有。这是之前从旧版本网站抓取的一些数据。一方面,从现在开始,我将尽量避免使用 RDBM 中的数组。

标签: regex postgresql replace pattern-matching


【解决方案1】:

Aelor 很接近,但使用了肯定而不是否定的断言,并且没有处理空间。 (实际上,根据评论,Aelor 回答了提出的具体问题;我正在展示如何通过在拆分时忽略逗号来完全避免删除逗号)。

还添加了来自corporateinformation.com 的公司名称后缀的完整列表。

regress=> SELECT regexp_split_to_table(
            'Burn To Ground, Groupwise, Ltd., People, Inc., SepiaShot', 
            '\,(?!\s(?:A\. en P\.|AB|AB|A\.C\.|ACE|AD|AE|AG|AG|AG|AL|AmbA|ANS|Apb|ApS|ApS & Co\. K/S|AS|A/S|A\.S\.|A\.S\.|A\.S\.|A\.S\.|ASA|AVV|Bpk|Bt|B\.V\.|B\.V\.|B\.V\.|BVBA|CA|Corp\.|C\.V\.|CVA|CVoA|DA|d/b/a|d\.d\.|d\.d\.|d\.n\.o\.|d\.o\.o\.|d\.o\.o\.|EE|EEG|EIRL|ELP|EOOD|EPE|EURL|e\.V\.|GbR|GCV|GesmbH|GIE|GmbH & Co\. KG|GmbH|GmbH|GmbH|HB|hf|IBC|Inc\.|Inc|I/S|j\.t\.d\.|KA/S|Kb|Kb|KD|k\.d\.|k\.d\.|KDA|k\.d\.d\.|Kft|KG|KG|KGaA|KK|Kkt|Kol\. SrK|Kom\. SrK|k\.s\.|K/S|KS|Kv|Ky|Lda|LDC|LLC|LLP|Ltd\.|Ltda|Ltée\.|N\.A\.|NT|NV|NV|NV|NV|OE|OHG|OHG|OOD|OÜ|Oy|OYJ|P/L|PC Ltd|PLC|PMA|PMDN|PrC|Prp\. Ltd\.|PT|Pty\.|RAS|Rt|S\. de R\.L\.|S\. en C\.|S\. en N\.C\.|S/A|SA|SA|SA|sa|SA|SA|SA|SA|SA|SA|SA|S\.A\.|SA de CV|SAFI|S\.A\.I\.C\.A\.|SApA|Sarl|Sarl|SAS|SC|SC|S\.C\.|SCA|SCA|SCP|SCS|S\.C\.S\.|SCS|Sdn Bhd|SENC|SGPS|SK|SNC|SNC|SNC|SNC|SOPARFI|sp|SpA|spol s\.r\.o\.|SPRL|Sp\. z\.o\.o\.|Srl|Srl|Srl|Srl|Srl|td|TLS|VEB|VOF|v\.o\.s\.)) ?',
            'i'
          );
 regexp_split_to_table 
-----------------------
 Burn To Ground
 Groupwise, Ltd.
 People, Inc.
 SepiaShot
(4 rows)

在 PostgreSQL 9.3 上测试。

也要考虑非美国公司的后缀,例如德国“GMBH”。我强烈建议您将替换结果视为可疑结果,并让人工验证它们是否正确。

【讨论】:

  • 你做了相反的事情,哈哈。操作员想要删除 2nd and the 4th commas not the other ones 你已经删除了除了第 2 和第 4 之外的其余部分 :)
  • 不,我刚刚解决了整个问题,方法是拆分字符串而不去掉逗号。他们不需要删除逗号,只是为了字符串拆分模式表达式的目的而忽略它们。
  • 干得好!我现在不能使用它,因为我真的必须删除那些逗号(不是我的选择)。但希望在以后的版本中我可以保留它们。我保存参考!顺便说一句,这是您编译的令人印象深刻的后缀列表。
【解决方案2】:

你可以使用这个正则表达式:

\,(?=\s(?:Ltd|Inc))

我假设你只想删除这些词之前的逗号,如果你有更多的词,比如 corp.注册等等,您可以使用| 像这样将它们添加到正则表达式中

\,(?=\s(?:Ltd|Inc|Corp|Reg))

根据您的要求修改此正则表达式

这里是一个快速参考的演示:

http://regex101.com/r/rT5zB1

检查替换结果

【讨论】:

  • 我不确定 Pg 的正则表达式处理器是否支持断言。
  • 太棒了!我稍微修改了正则表达式并使用了这个:update companies set names = regexp_replace(names,'\,(?=\s?(?:AB|AG|SA|SARL|GMBH|BVBA|Ltée|LLP|II|Ltd|Inc|Corp)\M)','','ig')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
  • 2010-12-31
  • 2010-10-31
相关资源
最近更新 更多