gpt4 book ai didi

python - Python 2.X:使用正则表达式查找以“.inc”结尾的所有公司名称

转载 作者:太空宇宙 更新时间:2023-11-04 07:56:53 25 4
gpt4 key购买 nike

我正在尝试从新闻稿中提取公司名称。例如,下面是新闻发布的摘要(法语),其中包含以.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在每个公司名称之前指定了 ,,因此我使用它来确定公司名称是什么,而不是公司名称。

关于python - Python 2.X:使用正则表达式查找以“.inc”结尾的所有公司名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47316157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com