【问题标题】:How would I eliminate spacing, line breaks to have a space-delimited string for each string within my list python我将如何消除间距,换行符,以便为我的列表 python 中的每个字符串提供一个以空格分隔的字符串
【发布时间】:2017-07-05 22:00:24
【问题描述】:

大家好,我是 python 的新手,需要一些帮助。我有一些示例数据,想知道如何消除每个列表中每个字符串的间距。

data = [
 ['In dolore     .'], ['Voluptatum.    '],
 ['Veniam hic non minima.         '],
 ['Dolores       Quis enim'], 
 ['     sequi ducimus']
 ]
 print data

我想要的输出:

data = [
 ['In dolore.'], ['Voluptatum.'],
 ['Veniam hic non minima.'],
 ['Dolores Quis enim'], 
 ['sequi ducimus']
 ]

这是我认为可行但没有成功的两种方法

for i in data:
str = ''.join(data)
final_data = str.replace("  ","")
print final_data

我最后的尝试是这样的:

final_data = ''.join(data) 
final_data.replace("  ", "") 
print final_data

【问题讨论】:

  • data 是一个列表列表而不仅仅是一个字符串列表有什么原因吗?
  • 您预期输出的 In dalore 和 ['Voluptatum'] 部分的期间发生了什么?为什么不见了?
  • 您是否有理由将. 保留在第三个元素中而不是前两个元素中?
  • @yinnonsanders 好问题。数据是列表列表的原因是因为我使用 for 循环从 cvs 文件中读取它们以读取到达列并将每一行附加到一个空列表
  • @idjaw 抱歉我忘了加上句号

标签: python list whitespace removing-whitespace


【解决方案1】:

你可以在这里使用正则表达式

import re
for i in range(len(data)):
    data[i][0] = re.sub(r'(\w)\s\s+(\w)', r'\1 \2', data[i][0])
    data[i][0] = re.sub(r'\s\s+', r'', data[i][0])
    data[i][0] = re.sub(r"(\w)\s([.])", r"\1\2", dat[i][0])

正则表达式模式\s\s+ 匹配所有包含 2 个或更多空白字符的组。如前所述,如果两个单词之间有超过 1 个空格,这将消除单词之间的空格。 r'\w\s\s+\w', r'\1 \2' 通过使用单个空格消除单词边界之间的空格来解决这个问题。

还要注意它是data[i][0],因为奇怪的是数据是列表的列表。

【讨论】:

  • 这将在连续 >1 个字符时消除所有空白字符,而不会在单词之间留下任何空白字符。也不会删除前导或尾随空格。
  • 这会输出[['In dolore.'], ['Voluptatum.'], ['Veniam hic non minima.'], ['DoloresQuis enim'], ['sequi ducimus']]。这不是预期的输出。正则表达式还需要考虑另一种情况。请编辑。在编辑此答案之前,赞成票被锁定,并且会误导最终结果。
  • @idjaw 已经处理好了
  • 您提供的代码正在引发invalid group reference
  • @idjaw 顺便修好了
【解决方案2】:
import re
final_data = [[re.sub('\s+\.', '.', re.sub('\s+', ' ', s)).strip()] for l in data for s in l]
print final_data

[['In dolore.'], ['Voluptatum.'], ['Veniam hic non minima.'], ['Dolores Quis enim'], ['sequi ducimus']]

这种方式前导和尾随空格被删除,而内部空格并没有完全消除。

内部替换用单个空格替换多个空白字符,外部替换消除句点之前的空白字符。 strip 函数消除了前导和尾随空格。

【讨论】:

  • 不完全。您仍然会得到['In dolore .'] 在最后一个单词和句点之间有一个空格。正确的正则表达式已发布。
  • 已编辑以删除所有句点,因为这似乎是问题中可接受的选项。
  • 预期输出保留所有期间。如果您删除所有句点,这将与预期的输出不匹配。
  • 提供您的代码产生的输出以表明它有效。我运行它,它 is 实际上是预期的输出。你解释得越多越好。
  • 对不起,我写的时候答案没有说清楚。
【解决方案3】:

print [[s.replace(" ","")] for l in data for s in l ]

【讨论】:

  • [' sequi ducimus']['Veniam hic non minima. '] 仍有多余的空格。
  • 您可以使用 Nick Chapman 的答案中的正则表达式或添加 put s.replace(" ","").strip()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
相关资源
最近更新 更多