将漂亮的打印表解析为Python对象[关闭]

问题描述 投票:1回答:2

假设有一个名为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                     |
+------------------------------------+-----------------------------------+  """
python string list parsing tuples
2个回答
2
投票

这里的关键是彻底检查表并了解您要拉出的内容。

首先,逐行完成这样的字符串解析通常比较容易,因此您需要根据表行进行拆分,然后根据此行对列进行解析。我们这样做主要是因为好恶跨越多条线。

1。获取每一行

我们不知道表的宽度,所以我们使用正则表达式来拆分表,如下所示:

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

这为我们提供了与多行行相对应的数组。最后的数组切片将删除标头和我们不希望处理的任何尾随空格。但是,仍然存在将单元格中跨越多行的字符串组合在一起的问题。

2。寻找喜欢和不喜欢的人

如果我们遍历该行数组,我们知道每一行都有一个跨未知行数组的相似和不相似。我们将每个喜欢和不喜欢的对象初始化为一个数组,以使最后的合并更快。

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

3。处理每一行

在我们的行中,我们需要根据换行符对其进行拆分,然后根据管道(|)进行拆分。

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

4。拔出每个喜欢和不喜欢的对象

如果给定的一对具有多个值,那么我们必须捕捉一对好恶。因此,将其附加到我们的likedislike数组中-not喜好或不喜欢,因为它们包含我们最终格式化的字符串。我们还应该执行strip on these to remove any trailing or leading whitespace

strip

5。创建最终文本

一旦处理完行,我们就可以用单个空格 if len(pair) > 1: # Not a blank line like.append(pair[1].strip()) dislike.append(pair[2].strip()) ,并最终将它们添加到我们的join the stringsjoin the strings数组中。

likes

6。使用我们的新数据结构

现在我们可以使用这两个新列表以我们选择的方式进行处理,或者分别打印每个列表...

dislikes

...或 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)

完整代码:

zip() them together

这导致:

zip()

您可以看到print "A set of paired likes and dislikes" pprint(zip(likes,dislikes),indent=4)


1
投票

这是ReST(重组文本,一种标记形式的pythonic形式)中使用的表格式(其中的一种),并且有各种各样的解析器为它准备。

这里是一个,在旧的python.org网站上: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)

© www.soinside.com 2019 - 2024. All rights reserved.