根据列表python中的模式提取值

时间:2017-01-22 02:47:11

标签: python regex

我想根据列表中的某个模式提取值。

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

但我输错了。请帮我解决这个问题。

由于

2 个答案:

答案 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()仅匹配字符串的开头,因此唯一匹配的正则表达式是与股票代码本身匹配的正则表达式。

我已经在下面对您的代码进行了重新组织,以展示它是如何工作的。

  • 每次都不必使用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)