所以我有很多行(制作),如下所示:
VBD -> 'RATTLED'
PP -> CC PP|<PP-LOC-CC-PP>
LHS上总有一个部件然后箭头然后是RHS上的一个或两个部分。我如何存储或打电话给他们? (例如,遍历所有行(生产)并检查LHS是否为VBD或RHS是否为RATTLED(对于第一个模式)或RHS0是否为CC且RHS1为PP-PP | (对于第二种模式))?
同样,制作中的模式始终遵循以下之一:
A -> 'B'
或
C -> D E
A,B,C,D和E可以是任何东西(数字,字母,符号等)
答案 0 :(得分:2)
如果你想要的是将每一行分成头(例如VBD
)和尾(例如'RATTLED'
),一个简单的方法就是使用{{1}像这样的运算符:
split
这假设每一行只有一个“ - &gt;”,并且每一行在“ - &gt;”的每一边都有一个空格。分离器。
我不确定我是否了解您的实现细节,但如果您想检查任何给定的尾部是否像for line in lines:
split_line = line.split(" -> ")
head = split_line[0]
tail = split_line[1]
或类似'RATTLED'
,您可以像这样迭代尾部:
CC PP|<PP-LOC-CC-PP>
for token in tail:
if token[0] == "'":
# this is a string, like 'B'
else:
# this is like D E etc.
two_part_style_split = token.split(' ')
看起来像这样:
two_part_style_split
答案 1 :(得分:0)
您可以使用正则表达式来分解部分。我在第二步中剥离了空白,以防止正则表达式看起来太糟糕。
import re
tests = ["VBD -> 'RATTLED'", "PP -> CC PP|<PP-LOC-CC-PP>"]
# use positive lookahead to find everything before ->,
# then everything between -> and (optional) |
# and everything after |
split_re = re.compile(r"(.*(?=->))->([^|]+)\|?(.*)?")
def parse(txt):
# pull out the values then strip any surrounding whitespace
return (t.strip() for t in split_re.match(txt).groups())
for test in tests:
a, b, c = parse(test)
print a,b,c
更复杂的正则表达式允许您在单独的步骤中跳过剥离值,导致可读性降低:
split_re = re.compile(r"\s*(.*(?=\s*->))\s*->\s*(.*(?=\s*(?:\|)?)+)\s*\|?\s*(.*)?")
for test in tests:
a, b, c = split_re.match(test).group()
print a,b,c