2

给定一个演员列表,他们的角色名称在括号中,用分号 (;) 或逗号 (,) 分隔:

Shelley Winters [Ruby]; Millicent Martin [Siddie]; Julia Foster [Gilda]; 
Jane Asher [Annie]; Shirley Ann Field [Carla]; Vivien Merchant [Lily]; 
Eleanor Bron [Woman Doctor], Denholm Elliott [Mr. Smith; abortionist]; 
Alfie Bass [Harry]

我如何将其解析为 [(actor, character),...] 形式的两种类型的列表

--> [('Shelley Winters', 'Ruby'), ('Millicent Martin', 'Siddie'), 
     ('Denholm Elliott', 'Mr. Smith; abortionist')]

我原来有:

actors = [item.strip().rstrip(']') for item in re.split('\[|,|;',data['actors'])]
data['actors'] = [(actors[i], actors[i + 1]) for i in range(0, len(actors), 2)]

但这并不完全奏效,因为它还将括号内的项目分开。

4

2 回答 2

4

您可以使用以下内容:

>>> re.findall(r'(\w[\w\s\.]+?)\s*\[([\w\s;\.,]+)\][,;\s$]*', s)
[('Shelley Winters', 'Ruby'),
 ('Millicent Martin', 'Siddie'),
 ('Julia Foster', 'Gilda'),
 ('Jane Asher', 'Annie'),
 ('Shirley Ann Field', 'Carla'),
 ('Vivien Merchant', 'Lily'),
 ('Eleanor Bron', 'Woman Doctor'),
 ('Denholm Elliott', 'Mr. Smith; abortionist'),
 ('Alfie Bass', 'Harry')]

还可以通过以下方式简化一些事情.*?

re.findall(r'(\w.*?)\s*\[(.*?)\][,;\s$]*', s)
于 2013-02-15T22:17:21.253 回答
1
inputData = inputData.replace("];", "\n")
inputData = inputData.replace("],", "\n")
inputData = inputData[:-1]
for line in inputData.split("\n"):
    actorList.append(line.partition("[")[0])
    dataList.append(line.partition("[")[2])
togetherList = zip(actorList, dataList)

这有点小技巧,我相信你可以从这里清理它。我将逐步介绍这种方法,以确保您了解我在做什么。

我将 the;和 the都替换,为换行符,稍后我将使用它来将每一对拆分为自己的行。假设您的内容没有充满错误];],' 这应该有效。但是,您会注意到最后一行]末尾有 a,因为它不需要逗号或分号。因此,我将它与第三行拼接起来。

然后,仅使用我们在输入字符串中创建的每一行的分区函数,我们将左侧部分分配给参与者列表,将右侧部分分配给数据列表并忽略括号(位于位置 1)。

之后,Python 非常有用的 zip 函数应该为我们完成这项工作,方法是i将每个列表的第 th 个元素关联到一个匹配的元组列表中。

于 2013-02-15T22:17:06.623 回答