首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用上下文-无语法分析选项扩展顺序字符串?

使用上下文-无语法分析选项扩展顺序字符串?
EN

Stack Overflow用户
提问于 2020-08-27 12:45:29
回答 1查看 42关注 0票数 0

我需要创建一个工具,它以字符串格式读取选项、扩展顺序,并以人类可读的格式将其吐出。

示例:

输入:

代码语言:javascript
运行
复制
BUY +6 VERTICAL LUV 100 (Weeklys) 28 AUG 20 37.5/36.5 PUT @.49 LMT

输出:

代码语言:javascript
运行
复制
VERTICAL
BUY +6 LUV 28 AUG 20 (Weeklys) 37.5 PUT
SELL -6 LUV 28 AUG 20 (Weeklys) 36.5 PUT
.49 DEBIT LMT

输入:

代码语言:javascript
运行
复制
BUY +1 DIAGONAL AMGN 100 (Weeklys) 4 SEP 20/28 AUG 20 245/240 CALL @.07 LMT

输出:

代码语言:javascript
运行
复制
DIAGONAL
BUY +1 AMGN 4 SEP 20 (Weeklys) 245 CALL
SELL +1 AMGN 28 AUG 20 (Weeklys) 240 CALL
-.07 CREDIT LMT

从表面上看,上下文无关语法似乎是表达各种语法的一个很好的解决方案(对角线扩展更复杂)。但是,几乎没有上下文无关语法的经验,我不知道我将如何携带数字,以及如何添加,例如,销售订单,但没有明确提到的原始订单字符串。出售腿是假设的,因为它是一个垂直的价差,例如。

希望这是有意义的,即使你不是期权交易者;-)这里的基本思想是,翻译原始字符串需要一点智慧,而不仅仅是生成不同的文本。

任何见解和建议都将受到欢迎。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-28 21:36:24

从两个例子中很难看出这一点,但我的猜测是,使用上下文无关的语法(尤其是如果您几乎没有使用它们的经验)可能是过分的。语法本身可能很简单,但您需要添加“操作”来将已识别的输入转换为所需的输出,或者让解析器构建语法树,然后编写代码从树中提取数据并生成所需的输出。

与捕获一起使用正则表达式会更简单。例如,下面的一些python3代码处理了您的两个示例:

代码语言:javascript
运行
复制
import sys, re

for line in sys.stdin:
    
    mo = re.fullmatch(r'BUY \+(\d+) (VERTICAL|DIAGONAL) (\S+) 100 \(Weeklys\) (\d+ \w+ \d+)(?:/(\d+ \w+ \d+))? ([\d.]+)/([\d.]+) (PUT|CALL) @(.\d+) LMT\n', line)
    (n_units, vert_or_diag, name, date1, date2, price1, price2, put_or_call, limit) = mo.groups()

    if vert_or_diag == 'VERTICAL':
        assert date2 is None
        date2 = date1

    print()
    print(vert_or_diag)
    print(f"BUY +{n_units} {name} {date1} (Weeklys) {price1} {put_or_call}")
    print(f"SELL -{n_units} {name} {date2} (Weeklys) {price2} {put_or_call}")
    print(f"{limit} DEBIT LMT")

这并不完美,因为问题没有得到完美的说明(例如,不清楚是什么原因导致人类可读的格式有一个正借方而不是负信用)。而且,输入空间无疑比正则表达式当前处理的要大。

这一点只是为了表明,根据所给出的例子,正则表达式可以是一般问题的一个紧凑的解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63616301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档