首页 > 解决方案 > 熊猫 - 提取方法不匹配任何东西

问题描述

我对这个看似简单的任务有疑问。这是我的问题的娱乐:

我有一个名为 legal 这种形式的数据框:

+----+-----------------+
|    | legal           |
|----+-----------------|
|  0 | gmbh            |
|  1 | kg              |
|  2 | ag              |
|  3 | GmbH & Co. KGaA |
|  4 | LP              |
|  5 | LLP             |
|  6 | LLLP            |
|  7 | LLC             |
|  8 | PLLC            |
|  9 | corp            |
| 10 | corporation     |
| 11 | inc             |
| 12 | cic             |
| 13 | cio             |
| 14 | ltd             |
| 15 | s.a.            |
+----+-----------------+

它包含可以代表给定公司的法律条款的所有单词。

现在我有另一个数据框,其中包含可能还包含一些法律条款的公司原始名称列表。我的任务是为数据框中的每个公司行名称识别此类法律术语companies。我正在尝试使用一些正则表达式,以便法律条款可能是大写和小写(或混合)。所以我为此使用方法提取

为了演示,我的第一个公司原始名称是2&0 Technologies Inc,因此对于该公司,我希望inc从我的合法数据框中提取世界。

这是我的代码的简化版本,带有一些注释:

def format_companies(self, legals, locations):
        self.companies['base_name'] = ''
        self.companies['location'] = ''
        self.companies['legal'] = ''
        for i, row in self.companies.iterrows():
            legal_pattern = '/(' + "|".join(row['raw'].split()]) +')/ig'
            legal_pattern = rf'{legal_pattern}'
            print(legal_pattern) # It prints out -> /(2&0|Technologies|Inc)/ig
            legal = legals['legal'].str.extract(legal_pattern)
            print(tabulate(legal, headers='keys', tablefmt='psql')) # Everything is NaN. (results will be print below)
            if i >= 0:
                break

第一个 print 语句只是打印出 extract 方法中使用的模式,即/(2&0|Technologies|Inc)/ig.

第二种模式是从 extract 方法打印出结果,正如评论中所说,它返回一个 NaN 列表:

+----+-----+
|    |   0 |
|----+-----|
|  0 | nan |
|  1 | nan |
|  2 | nan |
|  3 | nan |
|  4 | nan |
|  5 | nan |
|  6 | nan |
|  7 | nan |
|  8 | nan |
|  9 | nan |
| 10 | nan |
| 11 | nan |
| 12 | nan |
| 13 | nan |
| 14 | nan |
| 15 | nan |
+----+-----+

我很困惑,因为如果您在https://www.regextester.com//(2&0|Technologies|Inc)/ig上的文本“inc”上尝试正则表达式,inc 会被正确选择。

我究竟做错了什么?

标签: pythonregexpandas

解决方案


str.extract()不识别正则表达式模式/i以指示 IGNORECASE。要解决此问题,您可以通过 2 种方式进行:

方法 1:更改legal_pattern不带/and的定义/ig

legal_pattern = '(' + "|".join(row['raw'].split()]) +')'
legal_pattern = rf'{legal_pattern}'

而是使用 中的标志re.IGNORECASEstr.extract()如下所示:

import re
legals['legal'].str.extract(legal_pattern, re.IGNORECASE)

方法2:或者,也可以(?i)在正则表达式中使用来表示IGNORECASE,如下:

legal_pattern = '(?i)(' + "|".join(row['raw'].split()]) +')'
legal_pattern = rf'{legal_pattern}'

然后,您可以str.extract()在不指定的情况下使用re.IGNORECASE

legals['legal'].str.extract(legal_pattern)

结果:

      0
0   NaN
1   NaN
2   NaN
3   NaN
4   NaN
5   NaN
6   NaN
7   NaN
8   NaN
9   NaN
10  NaN
11  inc
12  NaN
13  NaN
14  NaN
15  NaN

推荐阅读