使用python从段落中提取文本

使用python从段落中提取文本,python,regex,python-3.x,Python,Regex,Python 3.x,我正在做一个项目,我们想从一段文字中提取公司名称、城市、州和美元金额。通常,这些信息会出现在段落的开头,我一直在使用正则表达式来查找第一个美元符号(这将是我们提取的金额),并在每个逗号之间查找文本,因为我们知道文本的顺序。例如: company name, city, state, amount $123,456,653 我们遇到过这样的情况:可能有X家公司,其次是他们所在的城市和州,然后才是美元金额 Example: company name 1, city, state, company

我正在做一个项目,我们想从一段文字中提取公司名称、城市、州和美元金额。通常,这些信息会出现在段落的开头,我一直在使用正则表达式来查找第一个美元符号(这将是我们提取的金额),并在每个逗号之间查找文本,因为我们知道文本的顺序。例如:

company name, city, state, amount $123,456,653
我们遇到过这样的情况:可能有X家公司,其次是他们所在的城市和州,然后才是美元金额

Example: company name 1, city, state, company name 2, city, state, amount $123,456,653
在某些情况下,可能会给出公司名称,但下一条信息可能不是城市,而是公司名称xxx

Example: company name 1, company name 1 longer, city, state, amount $123,456,653
最后,我们看到了一些案例,其中可能会有一份声明,说明有多少公司获得了一美元金额,然后是所有的公司名称

示例(片段):
25家公司已获得以下全球重量级服务的固定价格合同,不确定交付/不确定数量,固定价格合同,估计价值284932621美元:俄亥俄州威尔明顿市ABX航空公司(HTC71119DC002);俄亥俄州威尔明顿国际航空运输公司(HTC71119DC003);阿拉斯加航空公司,华盛顿州西雅图(HTC71119DC004);Allegiant Air LLC,内华达州拉斯维加斯(HTC71119DC005);美国航空公司,德克萨斯州沃思堡(HTC71119DC006);佛罗里达州劳德代尔堡Amerijet国际公司(HTC71119DC007);阿特拉斯航空公司,采购,纽约(HTC71119DC008;)三角洲航空公司,佐治亚州亚特兰大(HTC71119DC009);哥伦比亚特区华盛顿联邦快递公司(HTC71119DC010);XXXXXXXXXXXXX

通常,段落看起来是这样的(70-80%的时间):

只是想知道是否有人对python库或提取特定文本的更好方法有一些建议。我考虑实现某种类型的API,它将获取提取的值(用逗号分隔后),并通过检查它是城市还是州来运行它,然后我们可能知道数据在列表中的位置以及下一个位置(州)


这是我正在使用的当前正则表达式:r
'([^$]*),.*?\$([0-9,]+)

您可以设计一些表达式来捕获段落中的上市公司,例如:

(?i)([a-z0-9\s.-]*),([^\r\n,]*),\s*(Ohio|Washington|Georgia|Nevada|Florida|Texas|New York|District of Columbia)\s+\(\s*([a-z0-9]{13};?)\s*\)
并根据您的意愿添加或删除边界,对于其他边界,您也可以这样做

试验 输出
如果您希望探索/简化/修改该表达式,它已被删除 在的右上面板上进行了说明 . 如果你愿意,你可以 也可以观看,它将如何匹配 对照一些样本输入


哇。这是雄心勃勃的。我个人怀疑正则表达式在这里是否能很好地工作,因为正则表达式需要某种标准化。如果有不同的顺序,特别是关于城市名称,这将是困难的。首先,你应该发布更多的样本。第二,如果你发布了你想要的输出,这可能会很好……第二,在你70-80%的例子中,
L-3
是典型的吗?在一个段落blob中,您需要有一些东西来初始化regex,以便知道在一个组中捕获的内容代表一个公司名称,与其他名称不同words@FailSafe一个文本分析库可能有点过头了,我仍然认为最好的方法是将ngrams数据库与regex.lol结合使用,你和我都可以。我认为在70-80%的时间里,我都可以捕获我需要的内容,但可能需要用户手动输入。我看到你更新了自述,谢谢;)
(?i)([a-z0-9\s.-]*),([^\r\n,]*),\s*(Ohio|Washington|Georgia|Nevada|Florida|Texas|New York|District of Columbia)\s+\(\s*([a-z0-9]{13};?)\s*\)
import re

string = """
Twenty-five companies have been awarded a firm-fixed-price contract under the following Global Heavyweight Service, indefinite-delivery/indefinite-quantity, fixed-price contracts with an estimated value of $284,932,621: ABX Air Inc., Wilmington, Ohio (HTC71119DC002); Air Transport International Inc., Wilmington, Ohio (HTC71119DC003); Alaska Airlines Inc., Seattle, Washington (HTC71119DC004); Allegiant Air LLC, Las Vegas, Nevada (HTC71119DC005); American Airlines, Fort Worth, Texas (HTC71119DC006); Amerijet International Inc., Fort Lauderdale, Florida (HTC71119DC007); Atlas Air Inc., Purchase, New York (HTC71119DC008;) Delta Air Lines Inc., Atlanta, Georgia (HTC71119DC009); Federal Express Corp., Washington, District of Columbia (HTC71119DC010);

"""

expression = r'(?i)([a-z0-9\s.-]*),([^\r\n,]*),\s*(Ohio|Washington|Georgia|Nevada|Florida|Texas|New York|District of Columbia)\s+\(\s*([a-z0-9]{13};?)\s*\)'
matches = re.findall(expression, string)

print(matches)
[(' ABX Air Inc.', ' Wilmington', 'Ohio', 'HTC71119DC002'), (' Air Transport International Inc.', ' Wilmington', 'Ohio', 'HTC71119DC003'), (' Alaska Airlines Inc.', ' Seattle', 'Washington', 'HTC71119DC004'), (' Allegiant Air LLC', ' Las Vegas', 'Nevada', 'HTC71119DC005'), (' American Airlines', ' Fort Worth', 'Texas', 'HTC71119DC006'), (' Amerijet International Inc.', ' Fort Lauderdale', 'Florida', 'HTC71119DC007'), (' Atlas Air Inc.', ' Purchase', 'New York', 'HTC71119DC008;'), (' Delta Air Lines Inc.', ' Atlanta', 'Georgia', 'HTC71119DC009'), (' Federal Express Corp.', ' Washington', 'District of Columbia', 'HTC71119DC010')]