我正试图从新闻稿中提取公司名称.作为一个例子,下面有一个新闻稿的片段(法语),其中包含七个以公司结尾的公司的名单.inc.
En effet,RevenuQuébecavait des motifs raisonnables de croire que ces entreprisesavaientutilisédefausses factures provenant deplusieurssociétés,dont Asphalte Vrac Transport inc.,9163-6704Québecinc.,EntrepriseDenisDupréinc.,Gestion Jean M. Machado inc.,Impact Technologie Environnementale inc.,Les entreprisesLucClémentinc.et Transport Vrac Globe International inc.
我正在尝试使用以下代码提取所有名称:
aa = re.findall('inc\.,? (.*?inc\.)', text)
Run Code Online (Sandbox Code Playgroud)
我设法捕获了不少,但由于某种原因我无法想象,我无法全部提取它们.这似乎微不足道,但它已经让我踩了几个小时....
任何帮助表示赞赏!
使用正则表达式模块(而不是re),您可以使用此解决方案.
这是原始的正则表达式,只匹配inc..这也不允许包含公司名称et.有关更全面的正则表达式,请参阅选项2.
[\p{Lu}\p{N}](?:(?!et)[^,])*inc\.
Run Code Online (Sandbox Code Playgroud)
对于更全面的正则表达式,也检查其他公司实体,如ltd.或sons,您可以使用以下正则表达式.
(?:et|,)[^,]*?([\p{Lu}\p{N}][^,]*?\s(?:inc\.|sons|ltd\.))
Run Code Online (Sandbox Code Playgroud)
注意:在某些正则表达式中,您可以使用\K令牌.此标记重置报告的匹配的起始点(任何以前消耗的字符不再包含在最终匹配中).如果您的正则表达式引擎支持\K令牌(并且不将其转换为文字K),则可以使用以下内容(有效地消除了对捕获组的需要).
(?:et|,)[^,]*?\K[\p{Lu}\p{N}][^,]*?\s(?:inc\.|sons|ltd\.)
^^
Run Code Online (Sandbox Code Playgroud)
恩effet,Revenu魁北克avait DES图案raisonnables德croire阙CES企业经营者avaientutilisé德fausses factures provenant德plusieurs船级社,不要的Asphalte VRAC运输INC.,9163-6704魁北克INC.,企业公司丹尼斯班杜雷INC.,GESTION让M.马查多INC .,Impact Technologie Environnementale inc.,Les entreprisesLucClémentinc.et Transport 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.
Run Code Online (Sandbox Code Playgroud)
[\p{Lu}\p{N}]匹配集合中的任何内容(在这种情况下\p{Lu}- 任何语言中的任何大写字符(包括用于大写法语字符的Unicode和用于数字公司的数字)(?:(?!et)[^,])*匹配以下任意次数(脾气贪婪的令牌)
(?!et)否定前瞻确保后面的内容不符合et字面意思[^,],从字面上匹配除逗号之外的任何字符inc\.inc.字面上匹配(?:et|,)字面上匹配et或逗号,[^,]*?匹配集合中不存在的任何字符(除逗号之外的任何字符,,任何次数,但尽可能少([\p{Lu}\p{N}][^,]*?\s(?:inc\.|sons|ltd\.)) 将以下内容捕获到捕获组1中
[\p{Lu}\p{N}] 匹配任何Unicode大写字符或Unicode编号(对于数字公司)[^,]*?匹配集合中不存在的任何字符(除逗号之外的任何字符,,任何次数,但尽可能少\s 匹配空白字符(?:inc\.|sons|ltd\.) 匹配以下任一项
inc\.inc.字面上匹配sonssons字面上匹配ltd\.ltd.字面上匹配使用正则表达式模块允许我们使用Unicode字符类,\p{Lu}以确保我们还可以捕获公司名称以大写Unicode字符开头的可能性,例如É.
正则表达式链接(在"代码"下)包含一个要测试的附加字符串:
, Étoile Simpsons et sons, Étoile Simpsons inc., Étoile et Simpsons inc.
Run Code Online (Sandbox Code Playgroud)
添加此附加行后,只应捕获以下字符串(根据OP的规范,有效的公司名称):
Étoile Simpsons et sonsÉtoile Simpsons inc.Étoile et Simpsons ltd.这提出了一些挑战,包括:
É.
[A-Z]来确保名称以大写字母开头.sons,但也包括sons(不能在第一场比赛停止sons).
Étoile Simpsons et sons例如为例.
sons在Simpsons.一种自然的本能(至少在正则表达式中)可能\b用于断言单词边界.尽管这可能是首选方法,但在这种情况下它不起作用.以法语单词blésons为例.使用\b将实际匹配,blésons因为\b即使u启用了标志,正则表达式引擎很少与Unicode字符正确匹配(这就是我使用的原因\s).sons在公司名称结束后(在句子中Their sons et sons, les sons.)出现该单词.它不得超越公司名称的结尾.
.*?.使它变得懒惰将允许它在第一场比赛时停止而不是错误地匹配整个句子.Their sons et sons, les sons.包含有效公司名称的所有部分(以大写字母开头的单词,后跟单词sons),但这不应该匹配,因为它不是公司名称.
,在每个公司名称之前指定了一个,我使用它来确定什么是公司名称而不是公司名称.| 归档时间: |
|
| 查看次数: |
681 次 |
| 最近记录: |