【问题标题】:Extract values based on a pattern in a list python根据列表python中的模式提取值
【发布时间】:2017-01-22 02:47:11
【问题描述】:

我想根据列表中的特定模式提取值。

**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)]']
[]
[]

但是我得到了错误的输出。请帮我解决问题。

谢谢

【问题讨论】:

  • 我在您的输出中没有看到任何错误。
  • 没有出现错误。但我得到错误的输出

标签: python regex


【解决方案1】:

首先,ticker 的每一项都包含多个用分号分隔的记录,所以我建议规范化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

【讨论】:

  • 输入错误:['BAC (NYSE) (92%); BAC (伦敦证券交易所) (92%); 8648 (东京证交所) (92%); VNTV (纽约证券交易所) (92%);摩根大通 (纽约证券交易所) (90%); JPM (LSE) (90%)]'] 我得到的错误是:AttributeError: 'NoneType' object has no attribute 'group'
  • 相同的输入再次失败。我想知道为什么它又失败了
  • 是的,它有效。我试图改变一点。m = re.search(r'(\w+) (\w+)((([\d]+)%))?', s)。这个案子怎么样? ['INTEL CORP (82%)'、'AUTODESK INC (54%)'、'ACCENTURE PLC (54%)'、'PEPSICO INC (53%)'、'VASCULAR SOLUTIONS INC (51%)'] 我不是能够提取 % 值
  • () 需要转义。
  • 我将如何做到这一点。我只得到无输出。m = re.search(r'(\w+)\ (\w+)((([\d]+)%))?', s)
【解决方案2】:

您的代码的问题在于您正在根据输入构建每个列表。您是在告诉它,“如果输入与我的正则表达式匹配,则列出输入”。 re.match() 仅匹配字符串的开头,因此唯一匹配的正则表达式是匹配股票代码本身的正则表达式。

我在下面稍微重新组织了您的代码,以展示它是如何工作的。

  • 对正则表达式使用 re.compile() 不必每次都创建
  • 使用 re.search() 可以找到嵌入的模式
  • 使用 match.group(1) 获取查询的匹配部分,而不是整个输入。
  • 分解你的输入,这样你一次只处理一个组

    #!/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)
    

【讨论】:

  • ['BAC (NYSE) (92%); BAC (伦敦证券交易所) (92%); 8648 (东京证交所) (92%); VNTV (纽约证券交易所) (92%);摩根大通 (纽约证券交易所) (90%); JPM (LSE) (90%)]'] 当我运行上述代码列表时,我得到错误的输出。输出是:BAC,;;;
  • @Mho - 因为现在您的输入在分号后有空格。相应地修复了股票正则表达式。
猜你喜欢
  • 2023-02-18
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
相关资源
最近更新 更多