Regex 解析这行文本最有效的方法是什么?

Regex 解析这行文本最有效的方法是什么?,regex,parsing,python-2.7,Regex,Parsing,Python 2.7,以下是我从web上提取的一行: AIG$30 AIG是一家在纽约证券交易所上市的国际知名保险公司。需要一段时间。手动自动激活3 0.0510、0.0500、0.0300[摘录] 我将通过解析文本和检索相关数据来创建5个单独的变量。然而,我真的不理解REGEX文档!有谁能指导我如何用这个例子正确地做到这一点 名称=美国国际集团 当前价格=$30 状态=活动 世界排名=3 历史=0.0510,0.0500,0.0300 不确定你想在这里实现什么。不需要使用regexps,只需使用str.split:

以下是我从web上提取的一行:

AIG$30 AIG是一家在纽约证券交易所上市的国际知名保险公司。需要一段时间。手动自动激活3 0.0510、0.0500、0.0300[摘录]

我将通过解析文本和检索相关数据来创建5个单独的变量。然而,我真的不理解REGEX文档!有谁能指导我如何用这个例子正确地做到这一点

名称=美国国际集团

当前价格=$30

状态=活动

世界排名=3

历史=0.0510,0.0500,0.0300


不确定你想在这里实现什么。不需要使用regexps,只需使用
str.split

>>> str = "AIG $30 AIG is an international renowned insurance company listed on the NYSE. A period is required. Manual Auto Active 3 0.0510, 0.0500, 0.0300 [EXTRACT]"
>>> list = str.split()
>>> dict = { "Name": list[0], "CurrentPrice": list[1], "Status": list[19], "WorldRanking": list[20], "History": ' '.join((list[21], list[22], list[23])) }

#output
>>> dict
{'Status': 'Active', 'CurrentPrice': '$30', 'Name': 'AIG', 'WorldRanking': '3', 'History': '0.0510, 0.0500, 0.0300'}
您可能希望将其更改为
list[-n]
,而不是使用
list[19]
等,以不依赖于公司的描述长度。就像这样:

>>> history = ' '.join(list[-4:-1])
>>> history
'0.0510, 0.0500, 0.0300'
对于浮动历史索引,可以更容易地使用
re

>>> import re
>>> history = re.findall("\d\.\d{4}", str)
>>> ['0.0510', '0.0500', '0.0300']
为了标识状态,您可以获取历史值的索引,然后减去一:

>>> [ i for i, substr in enumerate(list) if re.match("\d\.\d{4}", substr) ]
[21, 22, 23]

>>> list[21:24]
['0.0510,', '0.0500,', '0.0300,']

>>> status = list[20]
>>> status
'3'

不确定你想在这里实现什么。不需要使用regexps,只需使用
str.split

>>> str = "AIG $30 AIG is an international renowned insurance company listed on the NYSE. A period is required. Manual Auto Active 3 0.0510, 0.0500, 0.0300 [EXTRACT]"
>>> list = str.split()
>>> dict = { "Name": list[0], "CurrentPrice": list[1], "Status": list[19], "WorldRanking": list[20], "History": ' '.join((list[21], list[22], list[23])) }

#output
>>> dict
{'Status': 'Active', 'CurrentPrice': '$30', 'Name': 'AIG', 'WorldRanking': '3', 'History': '0.0510, 0.0500, 0.0300'}
您可能希望将其更改为
list[-n]
,而不是使用
list[19]
等,以不依赖于公司的描述长度。就像这样:

>>> history = ' '.join(list[-4:-1])
>>> history
'0.0510, 0.0500, 0.0300'
对于浮动历史索引,可以更容易地使用
re

>>> import re
>>> history = re.findall("\d\.\d{4}", str)
>>> ['0.0510', '0.0500', '0.0300']
为了标识状态,您可以获取历史值的索引,然后减去一:

>>> [ i for i, substr in enumerate(list) if re.match("\d\.\d{4}", substr) ]
[21, 22, 23]

>>> list[21:24]
['0.0510,', '0.0500,', '0.0300,']

>>> status = list[20]
>>> status
'3'

嗨,IOXenus,这似乎适用于这句话。但是,如果我需要对多行重复执行,我想知道它是否有效。让我试一试。马上回来只是好奇,如果历史价格可能包含3个以上的元素呢?我如何才能捕获所有内容?@TingPing当然可以,但请确保在字符串末尾使用负面列表索引,因为公司描述的字数可能会有所不同。因此,对于Name和CurrentPrice使用
list[n]
,而对于Status和History等其他变量则使用
list[-n]
。一种方法是找出变量秩的负索引位置,并运行一个循环到零。例如,如果秩的反向索引位置为-5,则我将启动一个循环来连接-4、-3、-2和-1以获取数据。有没有更有效的方法,因为我听说for-loop对于巨大的数据源来说可能非常慢。re方法可能不可靠。如果当前价格是0.30美元,它也会将其作为结果的一部分返回。嗨,IOXenus,这似乎适用于这句话。但是,如果我需要对多行重复执行,我想知道它是否有效。让我试一试。马上回来只是好奇,如果历史价格可能包含3个以上的元素呢?我如何才能捕获所有内容?@TingPing当然可以,但请确保在字符串末尾使用负面列表索引,因为公司描述的字数可能会有所不同。因此,对于Name和CurrentPrice使用
list[n]
,而对于Status和History等其他变量则使用
list[-n]
。一种方法是找出变量秩的负索引位置,并运行一个循环到零。例如,如果秩的反向索引位置为-5,则我将启动一个循环来连接-4、-3、-2和-1以获取数据。有没有更有效的方法,因为我听说for-loop对于巨大的数据源来说可能非常慢。re方法可能不可靠。如果当前价格是0.30美元,它也会将其作为结果的一部分返回。regexes的关键是你必须能够用英语描述自己寻找东西的规则。你不能只是举个例子。你必须考虑“名字是第一个字符串,一直到第一个空格”和“历史是一组三个十进制数字,用逗号分隔。”所以把它们写出来并放在你的问题主体中。计算机是如何找到世界排名的?它如何知道状态是什么?用英语描述这些,然后写正则表达式,我们可以帮你。定义规则取决于你自己。正则表达式的关键是你必须能够用英语描述自己寻找事物的规则。你不能只是举个例子。你必须考虑“名字是第一个字符串,一直到第一个空格”和“历史是一组三个十进制数字,用逗号分隔。”所以把它们写出来并放在你的问题主体中。计算机是如何找到世界排名的?它如何知道状态是什么?用英语描述这些,然后写正则表达式,我们可以帮你。定义规则取决于您。