用于权益选项的Python Regex不匹配

时间:2017-08-08 14:47:19

标签: python regex finance

我试图创建一个正则表达式来查找代理数据中的选项符号。每Wikipedia格式为:

  1. 基础股票或ETF的根符号,填充空格为6个字符
  2. 到期日期,格式为yymmdd的6位数字
  3. 选项类型,P或C,用于投放或致电
  4. 行价,价格为x 1000,正面填充0到8位
  5. 所以我创建了这个正则表达式:

    option_regex = re.compile(r'''(
    (\w{1,6})            # beginning ticker, 1 to 6 word characters
    (\s)?                # optional separator
    (\d{6})              # 6 digits for yymmdd
    ([cp])               # C or P for call or put
    (\d{8})              # 8 digits for strike price
    )''', re.VERBOSE | re.IGNORECASE)
    

    但是当我测试它时,我得到一个错误:

    import re
    
    option_regex = re.compile(r'''(
    (\w{1,6})            # beginning ticker, 1 to 6 word characters
    (\s)?                # optional separator
    (\d{6})              # 6 digits for yymmdd
    ([cp])               # C or P for call or put
    (\d{8})              # 8 digits for strike price
    )''', re.VERBOSE | re.IGNORECASE)
    
    result = option_regex.search('AAPL  170818C00155000')
    
    result.group()
    Traceback (most recent call last):
    
      File "<ipython-input-4-0273c989d990>", line 1, in <module>
        result.group()
    
    AttributeError: 'NoneType' object has no attribute 'group'
    

1 个答案:

答案 0 :(得分:3)

来自python documentation on re.search()

  

扫描字符串,查找正则表达式模式生成匹配项的第一个位置,并返回相应的MatchObject实例。 如果字符串中的位置与模式匹配,则返回None;请注意,这与在字符串中的某个点找到零长度匹配不同。

您的代码抛出此异常,因为子例程没有找到任何内容。基本上,您尝试在.group()上运行None。防御它是个好主意:

if not result:
    ... # Pattern didn't match the string
    return

您的模式与您输入的字符串不匹配,因为它的分隔符比您预期的更长:它有2个空格而不是1个空格。您可以通过在规则中添加+(&#34;至少一次&#34;)来解决此问题:

(\s+)?                # optional separator