python - 熊猫 - 提取方法不匹配任何东西
问题描述
我对这个看似简单的任务有疑问。这是我的问题的娱乐:
我有一个名为 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 会被正确选择。
我究竟做错了什么?
解决方案
str.extract()
不识别正则表达式模式/i
以指示 IGNORECASE。要解决此问题,您可以通过 2 种方式进行:
方法 1:更改legal_pattern
不带/
and的定义/ig
:
legal_pattern = '(' + "|".join(row['raw'].split()]) +')'
legal_pattern = rf'{legal_pattern}'
而是使用 中的标志re.IGNORECASE
,str.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
推荐阅读
- postgresql - 无法在我的系统上运行 postgres。它显示 `postgres 不在 sudoers 文件中。将报告此事件。
- c++ - 为什么函数模板参数在传递给宏时会作为额外的函数参数出现?
- php - Wordpress 在 2020 年后执行 PHP
- angular - Angular 10:路径映射在导入时在 VSCode 中显示错误
- python - 有没有办法在 python 的单行 if 语句中分配或附加变量?
- svg - 原点中心符号
- r - 从一系列 R 图中删除图标题
- python - 如何从 JSON 结果中删除数据
- mysql - 通过 MySQL 中的查询使用其他表中的值更新 DYNAMIC 字段(意思是不提及字段名称)
- c++ - LeetCode 1: 两个 Sum - addressSanitizer: heap-buffer-overflow on address