我想根据列表中的某个模式提取值。
**Example:**
ticker=['HF (NYSE) (81%);BPO (NEW YORK)]']
**Expected Output:**
Tickercode-HF;BPO
StockCode-NYSE;NEW YORK
Relevancescore-81;0
**My code**:
Tickercode=[x for x in ticker if re.match(r'[\w\.-]+[\w\.-]+', x)]
Stockcode=[x for x in ticker if re.match(r'[\w\.-]+(%)+[\w\.-]+', x)]
Relevancescore=[x for x in ticker if re.match(r'[\w\.-]+(%)+[\w\.-]+', x)]
**My output:**
['HF (NYSE) (81%);BPO (NEW YORK)]']
[]
[]
但我输错了。请帮我解决这个问题。
由于
答案 0 :(得分:3)
第一,ticker
的每个项目包含以分号分隔的多个记录,因此我建议规范化自动收报机。然后迭代字符串并使用提取信息
模式'(\w+) \(([\w ]+)\)( \(([\d]+)%\))?'
。
import re
ticker=['HF (NYSE) (81%);BPO (NEW YORK)]']
ticker=[y for x in ticker for y in x.split(';')]
Tickercode=[]
Stockcode=[]
Relevancescore=[]
for s in ticker:
m = re.search(r'(\w+) \(([\w ]+)\)( \(([\d]+)%\))?', s)
Tickercode.append(m.group(1))
Stockcode.append(m.group(2))
Relevancescore.append(m.group(4))
print(Tickercode)
print(Stockcode)
print(Relevancescore)
输出:
['HF', 'BPO']
['NYSE', 'NEW YORK']
['81', None]
<强>更新强>:
使用re.search
代替re.match
,它将匹配字符串开头的模式。您的输入有一个前导空格,导致失败。
您可以添加此项以打印哪个字符串不匹配。
if m is None:
print('%s cannot be matched' % s)
continue
答案 1 :(得分:0)
您的代码存在的问题是您正在从输入中构建每个列表。你告诉它,“如果输入匹配我的正则表达式,请输入一个输入列表”。 re.match()
仅匹配字符串的开头,因此唯一匹配的正则表达式是与股票代码本身匹配的正则表达式。
我已经在下面对您的代码进行了重新组织,以展示它是如何工作的。
分解您的输入,这样您一次只能处理一个组
#!/usr/bin/env python
import re
# Example:
ticker=['HF (NYSE) (81%);BPO (NEW YORK)]']
# **Expected Output:**
# Tickercode-HF;BPO
# StockCode-NYSE;NEW YORK
# Relevancescore-81;0
tickercode=[]
stockcode=[]
relevancescore=[]
ticker_re = re.compile(r'^\s*([A-Z]+)')
stock_re = re.compile(r'\(([\w ]+)\)')
relevance_re = re.compile(r'\((\d+)%\)')
for tick in ticker:
for stockinfo in tick.split(";"):
ticker_match = ticker_re.search(stockinfo)
stock_match = stock_re.search(stockinfo)
relevance_match = relevance_re.search(stockinfo)
ticker_code = ticker_match.group(1) if ticker_match else ''
stock_code = stock_match.group(1) if stock_match else ''
relevance_score = relevance_match.group(1) if relevance_match else '0'
tickercode.append(ticker_code)
stockcode.append(stock_code)
relevancescore.append(relevance_score)
print 'Tickercode-' + ';'.join(tickercode)
print 'StockCode-' + ';'.join(stockcode)
print 'Relevancescore-' + ';'.join(relevancescore)