3

likes_and_dislikes という文字列があり、以下に示すようなテーブルとして視覚的にフォーマットされているとします。

文字列を解析して、好き嫌いを含むタプルのリストを返すにはどうすればよいですか。また、タプルのリストから一番上のヘッダー (好き、嫌い) を削除する必要があります。

likes_and_dislikes="""

+------------------------------------+-----------------------------------+
| likes                              | dislikes                          |
+------------------------------------+-----------------------------------+
| Meritocracy                        | Favoritism, ass-kissing, politics |
+------------------------------------+-----------------------------------+
| Healthy debates and collaboration  | Ego-driven rhetoric, drama and FUD|
|                                    | to get one's way                  |
+------------------------------------+-----------------------------------+
| Autonomy given by confident leaders| Micro-management by insecure      |
| capable of attracting top-tier     | managers compensating for a weak, |
| talent                             | immature team                     |
+------------------------------------+-----------------------------------+  """
4

2 に答える 2

3

ここで重要なのは、テーブルを徹底的に調べて、何を引き出そうとしているかを理解することです。

まず第一に、このような文字列の解析は行ごとに行うと一般的に簡単なので、テーブルの行に基づいて分割し、それに基づいて列を解析する必要があります。これを行う主な理由は、好き嫌いが複数の線にまたがっているからです。

1. 各行の取得

テーブルの幅がわからないので、次のように正規表現を使用してテーブルを分割します。

pairs = re.split("\+-*\+-*\+\n?",likes_and_dislikes)[2:-1] #Drop the header and the tail

これにより、複数行の行に対応する配列が得られます。最後に配列をスライスすると、処理したくないヘッダーと末尾の空白が削除されます。ただし、セル内の複数の行にまたがる文字列をまとめるという問題はまだあります。

2. 好き嫌いを見つける

この行の配列を反復処理すると、各行には、未知の行配列にまたがる好き嫌いがあることがわかります。この like と dislike をそれぞれ配列として初期化し、最後に連結を高速化します。

for p in pairs:
  like,dislike = [],[]

3. 各行の処理

この行では、改行に基づいて分割し、次にパイプに基づいて分割する必要があります ( |)。

  for l in p.split('\n'):
    pair = l.split('|')

4. それぞれの好き嫌いを引き出す

与えられたペアに複数の値がある場合、キャプチャする好き嫌いのペアが必要です。したがって、最終的にフォーマットされた文字列を保持する好き嫌いではなくlike、 anddislike配列に追加します。また、これらに対して a を実行して、末尾または先頭の空白を削除する必要があります。strip

    if len(pair) > 1:
      # Not a blank line
      like.append(pair[1].strip())
      dislike.append(pair[2].strip())

5.最終テキストの作成

行の処理が完了したらjoin the strings、単一のスペースで行を処理し、最終的にこれらをlikesanddislikes配列に追加できます。

  if len(like) > 0:
    likes.append(" ".join(like))
  if len(dislike) > 0:
    dislikes.append(" ".join(dislike))

6. 新しいデータ構造の使用

これで、これら 2 つの新しいリストを使用して、各リストを個別に印刷するか、選択した方法で処理できます...

from pprint import pprint
print "Likes:"
pprint(likes,indent=4)
print "Dislikes:"
pprint(dislikes,indent=4)

...またはzip()それらを組み合わせて、好き嫌いのペアのリストを作成します!

print "A set of paired likes and dislikes"
pprint(zip(likes,dislikes),indent=4)

完全なコード:

likes_and_dislikes="""

+------------------------------------+-----------------------------------+
| likes                              | dislikes                          |
+------------------------------------+-----------------------------------+
| Meritocracy                        | Favoritism, ass-kissing, politics |
+------------------------------------+-----------------------------------+
| Healthy debates and collaboration  | Ego-driven rhetoric, drama and FUD|
|                                    | to get one's way                  |
+------------------------------------+-----------------------------------+
| Autonomy given by confident leaders| Micro-management by insecure      |
| capable of attracting top-tier     | managers compensating for a weak, |
| talent                             | immature team                     |
+------------------------------------+-----------------------------------+ """

import re
likes,dislikes = [],[]
pairs = re.split("\+-*\+-*\+\n?",likes_and_dislikes)[2:-1] #Drop the header and the tail
for p in pairs:
  like,dislike = [],[]
  for l in p.split('\n'):
    pair = l.split('|')
    if len(pair) > 1:
      # Not a blank line
      like.append(pair[1].strip())
      dislike.append(pair[2].strip())
  if len(like) > 0:
    likes.append(" ".join(like))
  if len(dislike) > 0:
    dislikes.append(" ".join(dislike))
from pprint import pprint
print "Likes:"
pprint(likes,indent=4)
print "Dislikes:"
pprint(dislikes,indent=4)
print "A set of paired likes and dislikes"
pprint(zip(likes,dislikes),indent=4)

これにより、次の結果が得られます。

Likes:
[   'Meritocracy',
    'Healthy debates and collaboration ',
    'Autonomy given by confident leaders capable of attracting top-tier talent']
Dislikes:
[   'Favoritism, ass-kissing, politics',
    "Ego-driven rhetoric, drama and FUD to get one's way",
    'Micro-management by insecure managers compensating for a weak, immature team']
A set of paired likes and dislikes
[   ('Meritocracy', 'Favoritism, ass-kissing, politics'),
    (   'Healthy debates and collaboration ',
        "Ego-driven rhetoric, drama and FUD to get one's way"),
    (   'Autonomy given by confident leaders capable of attracting top-tier talent',
        'Micro-management by insecure managers compensating for a weak, immature team')]

codepad で完全なコードの動作を確認できます。

于 2013-09-23T23:46:37.220 に答える