【问题标题】:How do i split a string in python with multiple separators?如何在 python 中使用多个分隔符拆分字符串?
【发布时间】:2012-06-18 12:24:34
【问题描述】:

有这行:

Breathing 1:-31.145 9:-32.8942 13:-35.8225 2:-35.9872 17:-36.2135 16:-36.6343 12:-36.7487 4:-37.8538 8:-38.6924 7:-39.0389 14:-39.0697 18:-40.0523 3:-40.5393 15:-40.5825 5:-41.6323 11:-45.2976 10:-53.3063 6:-231.617

我想将除分隔符之外的所有内容都存储在数组中(' ',':-')

【问题讨论】:

  • 您到底希望数组内容是什么?你确定你不想要-s 吗?数据结构的意义何在?
  • @KarlKnechtel 我确定我不想要'-'array[0]==Breathing , array[1]== 1, array[2]==31.145 等等。
  • 你试过正则表达式吗?
  • 我会认为1:-31.145 变成1-31.145(负数)?然后我又不知道数据是什么..

标签: python arrays string


【解决方案1】:

re.split 是执行此操作的一种简单方法 - 在这种情况下,您希望在分隔符集上进行拆分:

>>> import re
>>> thestring = "Breathing 1:-31.145 9:-32.8942 13:-35.8225 2:-35.9872 17:-36.2135 16:-36.6343 12:-36.7487 4:-37.8538 8:-38.6924 7:-39.0389 14:-39.0697 18:-40.0523 3:-40.5393 15:-40.5825 5:-41.6323 11:-45.2976 10:-53.3063 6:-231.617"
>>> re.split(r"[ :\-]+", thestring)
['Breathing', '1', '31.145', '9', '32.8942', '13', '35.8225', '2', '35.9872', '17', '36.2135', '16', '36.6343', '12', '36.7487', '4', '37.8538', '8', '38.6924', '7', '39.0389', '14', '39.0697', '18', '40.0523', '3', '40.5393', '15', '40.5825', '5', '41.6323', '11', '45.2976', '10', '53.3063', '6', '231.617']

[] 定义了一个字符集,包含一个空格:-(需要转义,因为它用于[a-z] 之类的范围)-字符集后面的+ 表示一个-或更多

要在空格或:- 上显式拆分,您可以使用| 或正则表达式:

>>> re.split(":-| ", thestring)
['Breathing', '1', '31.145', ...]

正如我在对该问题的评论中提到的,我原以为分隔符只是:- 表示负数..

【讨论】:

  • 如果您使用原始字符串,您的正则表达式会更容易阅读(您不必双重转义 -)。此外,这将在"- "" :" 上拆分...这可能完全可以接受,但与问题中的请求不太匹配。
  • @mgilson 好点 - 添加了拆分文字 :- 的解决方案,并使用原始字符串来避免 `\\\`ness
【解决方案2】:

更新:我没有意识到Breathing 是您数据的一部分。在这种情况下,您将获得所有字符串。

假设:

b = 'Breathing 1:-31.145 9:-32.8942 13:-35.8225 2:-35.9872'

那么这个简单的构造:

 b.replace(':-',' ').split()

将给予:

['Breathing', '1', '31.145', '9', '32.8942', '13', '35.8225', '2', '35.9872']

解释:它将任何:- 替换为空格(' ')。然后它会在有空格的地方拆分字符串以获取字符串列表。

要获取数字的float 值:

['Breathing'] + [float(i) for i in b.replace(':-',' ').split()[1:]]

结果:

['Breathing', 1.0, 31.145, 9.0, 32.8942, 13.0, 35.8225, 2.0, 35.9872]

解释:与上面类似,除了 float() 用于所有数字字符串以将它们转换为浮点数并且“呼吸”字符串放在列表的开头。

【讨论】:

  • @Levon...呼吸在哪里?
  • 我想你的意思是b.replace(':-', ' ')。实际上,您正在将两位数合并为一位。
  • 虽然我承认这确实是 OP 想要的,但很难相信将 '1:-31.145' 变成 '131.145' 是正确的做法。
  • @DSM 我同意,我对此也有些困惑,但 OP 特别提到 :- 作为分隔符 ...
  • @Levon:阅读 OP 的评论以回复 Karl Knechtel 对帖子的评论。
【解决方案3】:

您可以使用str.split([sep[, maxsplit]])

返回字符串中的单词列表,使用 sep 作为分隔符字符串。如果给定 maxsplit,则最多完成 maxsplit 拆分(因此,列表将最多具有 maxsplit+1 个元素)。如果未指定 maxsplit 或 -1,则对拆分的数量没有限制(进行所有可能的拆分)。

应用

>> ' 1  2   3  '.split()
['1', '2', '3']

str.replace(old, new[, count])“串联”

返回字符串的副本,其中所有出现的子字符串 old 都替换为 new。如果给出了可选参数 count,则仅替换第一个 count 出现。

应用

>>> a = 'h!e!l!l!o! w!o!r!l!d!'
>>> a.replace('!','')
'hello world'

应用于您的场景:

>> 'Breathing 1:-31.145 9:-32.8942 13:-35.8225 2:-35.9872 17:-36.2135 16:-36.6343
              12:-36.7487 4:-37.8538 8:-38.6924 7:-39.0389 14:-39.0697 18:-40.0523
              3:-40.5393 15:-40.5825 5:-41.6323 11:-45.2976 10:-53.3063 
              6:-231.617'.replace(':-',' ').split(' ')

 ['Breathing', '1', '31.145', '9', '32.8942', '13', '35.8225', '2', 
   '35.9872', '17', '36.2135', '16', '36.6343', '12', '36.7487', '4', '37.8538', 
   '8', '38.6924', '7', '39.0389', '14', '39.0697', '18', '40.0523', '3', 
   '40.5393', '15', '40.5825', '5', '41.6323', '11', '45.2976', 
   '10', '53.3063', '6', '231.617']

所有定义均来自手册

【讨论】:

  • 为什么使用rsplit() 而不是split()
  • @Lattyware : 只是打错了 :)
  • @acattle : 好好看看
  • @AiureaAdicatotYO :它们已被删除。看看输出
  • @acattle 如此重要,值得 -1 而没有 +1(s) 吗?
【解决方案4】:

使用正则表达式可能是最好的方法:

import re
re.split('\s+|:-','Breathing 1:-135')

这会给你['Breathing', '1', '135'],这正是你想要的。这里,\s+ 代表一个或多个空格,| 代表“或”,:- 是按字面意思匹配的。

编辑:@mgilson 给出了相同的答案。无论如何,你可能想看看documentation for python regex

【讨论】:

    【解决方案5】:
    import re
    array=re.split(r'\s+|:-',mystring)
    

    在正则表达式中,\s+ 匹配空格,而 :- 匹配字符串中的文字序列。如果这些条件中的任何一个匹配,管道 (|) 就是 re 表示匹配的方式。

    当然,如果您想确保按照您的问题要求在一个空格上拆分,您可以将"\s+" 更改为"\s" 甚至" "

    【讨论】:

      【解决方案6】:

      这不是你问的,但它可能是你需要的;-)

      lines = ['Breathing 1:-31.145 9:-32.8942 13:-35.8225 2:-35.9872 17:-36.2135 16:-36.6343 12:-36.7487 4:-37.8538 8:-38.6924 7:-39.0389 14:-39.0697 18:-40.0523 3:-40.5393 15:-40.5825 5:-41.6323 11:-45.2976 10:-53.3063 6:-231.617']
      
      data = {}
      for line in lines:
          line = line.split()   # split on spaces
          values = (s.split(':-') for s in line[1:])
          data[line[0]] = {int(t):float(val) for t,val in values}
      

      结果

      data = {
          'Breathing': {
              1: 31.145,
              2: 35.9872,
              3: 40.5393,
              4: 37.8538,
              5: 41.6323,
              6: 231.617,
              7: 39.0389,
              8: 38.6924,
              9: 32.8942,
              10: 53.3063,
              11: 45.2976,
              12: 36.7487,
              13: 35.8225,
              14: 39.0697,
              15: 40.5825,
              16: 36.6343,
              17: 36.2135,
              18: 40.0523
          }
      }
      

      然后你可以访问它

      data['Breathing'][2]   # -> 35.9872
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-27
        • 2011-06-27
        相关资源
        最近更新 更多