【问题标题】:Slicing multiline strings in a list在列表中切片多行字符串
【发布时间】:2021-03-23 17:05:38
【问题描述】:

我正在使用 python 3。我有一个多行、多字符串列表,我想以这样的方式对其进行切片,即保留每个字符串的前六个字符,而排除其余字符。当我使用下面给出的代码时,我只得到第一个字符串切片,即 a=[alkalak],而不是其他字符串。谁能告诉我我哪里做错了?

a= ['''alkalaklaklakalkaalaklakalkalaklaalkal,alkkllaklllaklllka,
    akalakalkalakhgalgh, ghoahlhoonlaholh,
     khlalkhalkhlahlakhlhlakhlahkahlhakhalh''']
for char in a:
a[a.index(char)] = char[: 6]
print (a)

【问题讨论】:

  • 您使用什么编程语言?如果我们不知道哪种语言,我们将无法为您提供帮助。
  • 我已经编辑过了。是蟒蛇
  • 我不确定你想要什么作为输出。你想用新行分割还是用逗号分割?您能否将预期的输出添加到您的帖子中?
  • 实际上,我想在这里拆分每个字符串,当然用逗号分隔。这里给出的所有答案都导致了线路的分裂。此外,这里的所有答案都在考虑仅包含一行的字符串,但没有解释如果全部或部分字符串是多行的会怎样。

标签: python-3.x string list multiline


【解决方案1】:

您的列表a 中只有一个元素。

>> a = ['''alkalaklaklakalkaalaklakalkalaklaalkal,alkkllaklllaklllka,
akalakalkalakhgalgh, ghoahlhoonlaholh,
 khlalkhalkhlahlakhlhlakhlahkahlhakhalh''']
>> len(a)
1

您可以用换行符或逗号分隔其中的单个字符串,如果这是您想要的,如下所示:

[x[:6] for x in a[0].split("\n")]

【讨论】:

    【解决方案2】:

    试试这个:

    a = [line.lstrip()[:6] for line in a[0].split('\n')]
    
    print(a)
    >> ['alkala', 'akalak', 'khlalk']
    

    【讨论】:

      【解决方案3】:

      对于多行列表,您不需要三引号(''' 或 """)。Python 将三引号内的所有字符作为单个字符串读取。因此,要让您的程序正常工作,请替换

      a= ['''alkalaklaklakalkaalaklakalkalaklaalkal,alkkllaklllaklllka,
          akalakalkalakhgalgh, ghoahlhoonlaholh,
           khlalkhalkhlahlakhlhlakhlahkahlhakhalh''']
      

      a= ['alkalaklaklakalkaalaklakalkalaklaalkal','alkkllaklllaklllka',
          'akalakalkalakhgalgh', 'ghoahlhoonlaholh',
           'khlalkhalkhlahlakhlhlakhlahkahlhakhalh']
      

      因此程序将作为

      a= ['alkalaklaklakalkaalaklakalkalaklaalkal','alkkllaklllaklllka',
          'akalakalkalakhgalgh', 'ghoahlhoonlaholh',
           'khlalkhalkhlahlakhlhlakhlahkahlhakhalh']
      for char in a:
          a[a.index(char)] = char[: 6]
      print (a)
      

      当我执行这个时,我得到一个输出

      ['alkala', 'alkkll', 'akalak', 'ghoahl', 'khlalk']
      

      因此,它现在应该可以工作了。

      【讨论】:

      • 感谢 Shuuvam 的回复。但是,如果列表中的每个字符串都不是多行而是在一行中完成,那么您的答案很好。但是,如果每个字符串都很长,例如由数百个字符组成???因此,用逗号分隔的每个字符串都将包含许多行。那么在这种情况下我该如何使用单引号呢??
      【解决方案4】:

      您可以使用带有锚点^ 的模式来断言字符串的开头。匹配前导空格,并在第 1 组中捕获 6 个非空白字符,这些字符将由 re.findall 返回并启用 re.MULTILINE

      ^[^\S\r\n]*(\S{6})
      

      模式匹配:

      • ^ 字符串开始
      • [^\S\r\n]* 匹配 0+ 次没有换行符的空白字符
      • ( 捕获 group 1(将由 re.findall 返回)
        • \S{6} 匹配 6 个非空白字符
      • )关闭第一组

      查看regex demo 或查看Python demo

      例如

      import re
      
      a= ['''alkalaklaklakalkaalaklakalkalaklaalkal,alkkllaklllaklllka,
          akalakalkalakhgalgh, ghoahlhoonlaholh,
           khlalkhalkhlahlakhlhlakhlahkahlhakhalh''']
      for s in a:
          print(re.findall(r"^[^\S\r\n]*(\S{6})", s, re.MULTILINE))
      

      输出

      ['alkala', 'akalak', 'khlalk']
      

      【讨论】:

      • 感谢@forth 鸟的回答。但是,这不是一条相当复杂的路线,尤其是对于不是编程专家的人。 :)
      • @ammadaslam 我已经添加了正则表达式的解释。
      猜你喜欢
      • 2014-07-08
      • 2015-10-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-24
      • 2023-04-09
      • 2017-02-15
      • 2020-11-27
      • 2021-11-20
      相关资源
      最近更新 更多