def parse(astr):
astr=astr.replace(',','')
astr=astr.replace('and','')
tokens=astr.split()
dept=None
number=None
result=[]
option=[]
for tok in tokens:
if tok=='or':
result.append(option)
option=[]
continue
if tok.isalpha():
dept=tok
number=None
else:
number=int(tok)
if dept and number:
option.append((dept,number))
else:
if option:
result.append(option)
return result
if __name__=='__main__':
tests=[ ("CS 2110" , [[("CS", 2110)]]),
("CS 2110 and INFO 3300" , [[("CS", 2110), ("INFO", 3300)]]),
("CS 2110, INFO 3300" , [[("CS", 2110), ("INFO", 3300)]]),
("CS 2110, 3300, 3140", [[("CS", 2110), ("CS", 3300), ("CS", 3140)]]),
("CS 2110 or INFO 3300", [[("CS", 2110)], [("INFO", 3300)]]),
("MATH 2210, 2230, 2310, or 2940", [[("MATH", 2210), ("MATH", 2230), ("MATH", 2310)], [("MATH", 2940)]])]
for test,answer in tests:
result=parse(test)
if result==answer:
print('GOOD: {0} => {1}'.format(test,answer))
else:
print('ERROR: {0} => {1} != {2}'.format(test,result,answer))
break
产量
GOOD: CS 2110 => [[('CS', 2110)]]
GOOD: CS 2110 and INFO 3300 => [[('CS', 2110), ('INFO', 3300)]]
GOOD: CS 2110, INFO 3300 => [[('CS', 2110), ('INFO', 3300)]]
GOOD: CS 2110, 3300, 3140 => [[('CS', 2110), ('CS', 3300), ('CS', 3140)]]
GOOD: CS 2110 or INFO 3300 => [[('CS', 2110)], [('INFO', 3300)]]
GOOD: MATH 2210, 2230, 2310, or 2940 => [[('MATH', 2210), ('MATH', 2230), ('MATH', 2310)], [('MATH', 2940)]]
0
好的,关于这个项目,我已经提出了许多较小的问题,但是我对要提出的设计仍然没有足够的信心,所以我将在更大范围内提出一个问题。
我正在解析课程目录的先决条件描述。描述几乎总是遵循某种形式,这使我认为我可以解析大多数形式。
根据本文,我想生成一个课程前提条件关系图。 (在我解析了数据之后,这部分将很容易。)
一些示例输入和输出:
如果整个描述只是一门课程,则直接输出。
如果课程是联合的(“和”),它们都将输出在同一列表中
如果课程不连贯(或),则它们在单独的列表中
在这里,我们同时具有“和”和“或”。
需要注意的一个问题是,它变得更加容易:“和” /“或”短语的嵌套似乎从来没有比示例3所示的嵌套大。
做这个的最好方式是什么?我从PLY开始,但是我不知道如何解决减少/减少冲突。 PLY的优点是很容易操纵每个解析规则生成的内容:
使用PyParse,尚不清楚如何修改
parseString()
的输出。我当时正在考虑以@Alex Martelli的想法为基础,即在一个对象中保持状态并从该对象中建立输出,但是我不确定确切如何做到最好。例如,要处理“或”情况:
disjunctionCourses()
如何知道要断开哪些较小的短语?它得到的只是令牌,但是到目前为止已解析的内容都存储在result
,那么该函数如何分辨result
哪些数据对应于token
哪些元素?我想我可以搜索标记,然后找到具有相同数据的result
元素,但是感觉有些费解。另外,还有许多包含杂项文本的描述,例如:
但是我解析该文本并不重要。
解决此问题的更好方法是什么?