我需要创建一个工具,它以字符串格式读取选项、扩展顺序,并以人类可读的格式将其吐出。
示例:
输入:
BUY +6 VERTICAL LUV 100 (Weeklys) 28 AUG 20 37.5/36.5 PUT @.49 LMT输出:
VERTICAL
BUY +6 LUV 28 AUG 20 (Weeklys) 37.5 PUT
SELL -6 LUV 28 AUG 20 (Weeklys) 36.5 PUT
.49 DEBIT LMT输入:
BUY +1 DIAGONAL AMGN 100 (Weeklys) 4 SEP 20/28 AUG 20 245/240 CALL @.07 LMT输出:
DIAGONAL
BUY +1 AMGN 4 SEP 20 (Weeklys) 245 CALL
SELL +1 AMGN 28 AUG 20 (Weeklys) 240 CALL
-.07 CREDIT LMT从表面上看,上下文无关语法似乎是表达各种语法的一个很好的解决方案(对角线扩展更复杂)。但是,几乎没有上下文无关语法的经验,我不知道我将如何携带数字,以及如何添加,例如,销售订单,但没有明确提到的原始订单字符串。出售腿是假设的,因为它是一个垂直的价差,例如。
希望这是有意义的,即使你不是期权交易者;-)这里的基本思想是,翻译原始字符串需要一点智慧,而不仅仅是生成不同的文本。
任何见解和建议都将受到欢迎。
发布于 2020-08-28 21:36:24
从两个例子中很难看出这一点,但我的猜测是,使用上下文无关的语法(尤其是如果您几乎没有使用它们的经验)可能是过分的。语法本身可能很简单,但您需要添加“操作”来将已识别的输入转换为所需的输出,或者让解析器构建语法树,然后编写代码从树中提取数据并生成所需的输出。
与捕获一起使用正则表达式会更简单。例如,下面的一些python3代码处理了您的两个示例:
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")这并不完美,因为问题没有得到完美的说明(例如,不清楚是什么原因导致人类可读的格式有一个正借方而不是负信用)。而且,输入空间无疑比正则表达式当前处理的要大。
这一点只是为了表明,根据所给出的例子,正则表达式可以是一般问题的一个紧凑的解决方案。
https://stackoverflow.com/questions/63616301
复制相似问题