我正在尝试从新闻稿中提取公司名称。例如,下面是新闻发布的摘要(法语),其中包含以.inc结尾的七家公司的列表。
整体而言,魁北克省可利用的有组织意义的花旗组织的法人企业,法国足协的原始产地的可利用的财产,阿斯帕尔特·弗拉克运输公司,魁北克公司9163-6704 。,Impact Technologie Environnementale inc。,Les entreprises LucClémentinc。等运输Vrac Globe International inc。
我正在尝试使用以下代码提取所有名称:
aa = re.findall('inc\.,? (.*?inc\.)', text)
我确实设法捕获了很多,但是由于某种原因,我无法确定,所以无法全部提取。似乎微不足道,但它使我tom了几个小时。
任何帮助表示赞赏!
请您参考如下方法:
简要
使用regex模块(而不是re)可以使用此解决方案。
码
选项1
这是原始正则表达式,仅匹配inc.。这也不允许包含et的公司名称。有关更全面的正则表达式,请参见选项2。
See regex in use here
[\p{Lu}\p{N}](?:(?!et)[^,])*inc\.
选项2
要获得更全面的正则表达式,并且该正则表达式还检查其他公司实体(例如
ltd.或
sons),则可以使用以下正则表达式。
See regex in use here
(?:et|,)[^,]*?([\p{Lu}\p{N}][^,]*?\s(?:inc\.|sons|ltd\.))
注意:在某些正则表达式中,可以使用
\K标记。此令牌重置报告的匹配项的起点(最终使用的匹配项中不再包含任何以前使用的字符)。如果您的正则表达式引擎支持
\K令牌(并且不将其转换为文字
K),则可以使用以下命令(有效消除捕获组的需要)。
See regex in use here
(?:et|,)[^,]*?\K[\p{Lu}\p{N}][^,]*?\s(?:inc\.|sons|ltd\.)
^^
结果
输入值
在魁北克省,可利用的主题是croire que
企业因故可利用的事实
plusieurssociétés,不要Asphalte Vrac Transport inc。,9163-6704
魁北克公司,丹尼斯·杜普瑞企业有限公司,吉恩·M·马查多手势
公司,冲击技术环境公司,Les企业,Luc
克莱门特公司等运输Vrac Globe International inc。
输出量
Asphalte Vrac Transport inc.
9163-6704 Québec inc.
Entreprise Denis Dupré inc.
Gestion Jean M. Machado inc.
Impact Technologie Environnementale inc.
Les entreprises Luc Clément inc.
Transport Vrac Globe International inc.
说明
选项1
[\p{Lu}\p{N}]匹配集合中的任何内容(在本例中为
\p{Lu}-任何语言的任何大写字符(包括大写法语字符的Unicode和数字公司的数字)
(?:(?!et)[^,])*匹配以下任意次数(
tempered greedy token)
(?!et)负向前瞻确保后面的内容与字面上的
et不符
[^,]从字面上匹配除逗号
,以外的任何字符
inc\.从字面上匹配
inc.
选项2
(?:et|,)逐字匹配
et或逗号
,
[^,]*?匹配集合中不存在的任何字符(除逗号
,以外的任何字符任何次数,但应尽可能少
([\p{Lu}\p{N}][^,]*?\s(?:inc\.|sons|ltd\.))将以下内容捕获到捕获组1中
[\p{Lu}\p{N}]匹配任何Unicode大写字符或Unicode数字(对于数字公司)
[^,]*?匹配集合中不存在的任何字符(逗号
,以外的任何字符)任意次,但次数尽可能少
\s匹配空白字符
(?:inc\.|sons|ltd\.)匹配以下任一
inc\.从字面上匹配
inc.
sons从字面上匹配
sons
ltd\.从字面上匹配
ltd.
笔记
正则表达式模块vs re
使用 regex模块允许我们使用
\p{Lu}之类的Unicode字符类,以确保我们也可以捕获以大写Unicode字符(例如
É)开头的公司名称的可能性。
捕捉特殊情况
正则表达式链接(在代码下)包括一个附加字符串,可用于测试:
, Étoile Simpsons et sons, Étoile Simpsons inc., Étoile et Simpsons inc.
添加此附加行后,仅应捕获以下字符串(根据OP的规范为有效的公司名称):
Étoile Simpsons et sons
Étoile Simpsons inc.
Étoile et Simpsons ltd.
这带来了一些挑战,包括:
公司名称以大写Unicode字符
É开头。
这意味着我们必须确保Unicode大写字母的兼容性,因此无法使用
[A-Z]之类的东西来确保名称以大写字母开头。
公司以
sons结尾,但也包括
sons(不能在
sons的第一个匹配项时停止)。
以
Étoile Simpsons et sons为例。
这不应以
sons中的
Simpsons结尾。一个自然的本能(至少在正则表达式中)可能是使用
\b声明单词边界。尽管这可能是首选方法,但在这种情况下它不起作用。以法语单词
blésons为例。使用
\b实际上会在
blésons中匹配,因为即使启用了
\b标志,正则表达式引擎也很少会与Unicode字符正确地匹配
u(这就是为什么我使用
\s的原因)。
公司名称结束后出现单词
sons(在句子
Their sons et sons, les sons.中)。它不能超过公司名称的结尾。
这对于使用惰性量词即
.*?是一个很好的例子。使其变得懒惰将使其停止在第一个匹配项上,而不是错误地匹配整个句子。
字符串
Their sons et sons, les sons.包含有效公司名称的所有部分(以大写字母开头的单词,后跟
sons单词),但这不应匹配,因为它不是公司名称。
由于OP在每个公司名称之前指定了
,,因此我使用它来确定公司名称是什么,而不是公司名称。
