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),...] の形式の 2 つのタイプのリストに解析するにはどうすればよいでしょうか。

--> [('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)

これはちょっとしたハックです。ここからクリーンアップできると確信しています。私がやっていることを理解していただけるように、このアプローチについて説明します。

;と の両方を改行に置き換えて,います。これは、後ですべてのペアを独自の行に分割するために使用します。あなたのコンテンツが誤ったもので満たされていないと仮定すると、];これ],はうまくいくはずです。]ただし、カンマやセミコロンが必要ないため、最後の行の最後に a が含まれていることに気付くでしょう。したがって、3行目でそれをつなぎ合わせます。

次に、入力文字列内で作成した各行でパーティション関数を使用するだけで、左側の部分をアクター リストに割り当て、右側の部分をデータ リストに割り当て、ブラケット (位置 1 にある) を無視します。

その後、Python の非常に便利な zip 関数がi、各リストの th 要素を一致するタプルのリストに関連付けることで、作業を完了します。

于 2013-02-15T22:17:06.623 に答える