假设有一个名为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 |
+------------------------------------+-----------------------------------+ """
这里的关键是彻底检查表并了解您要拉出的内容。
首先,逐行完成这样的字符串解析通常比较容易,因此您需要根据表行进行拆分,然后根据此行对列进行解析。我们这样做主要是因为好恶跨越多条线。
我们不知道表的宽度,所以我们使用正则表达式来拆分表,如下所示:
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('|')
如果给定的一对具有多个值,那么我们必须捕捉一对好恶。因此,将其附加到我们的like
和dislike
数组中-not喜好或不喜欢,因为它们包含我们最终格式化的字符串。我们还应该执行strip
on these to remove any trailing or leading whitespace。
strip
一旦处理完行,我们就可以用单个空格 if len(pair) > 1:
# Not a blank line
like.append(pair[1].strip())
dislike.append(pair[2].strip())
,并最终将它们添加到我们的join the strings
和join the strings
数组中。
likes
现在我们可以使用这两个新列表以我们选择的方式进行处理,或者分别打印每个列表...
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)
。
这是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)