如何拆分一条线的某些部分?

时间:2014-11-14 20:33:16

标签: python loops split

所以我有很多行(制作),如下所示:

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可以是任何东西(数字,字母,符号等)

2 个答案:

答案 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