【问题标题】:How to partial split and take the first portion of string in Python?如何在 Python 中部分拆分并获取字符串的第一部分?
【发布时间】:2020-08-31 22:02:35
【问题描述】:

有一个场景,我想部分拆分一个字符串并提取字符串的第一部分。

  1. 说字符串可以像 aloha_maui_d0_b0 或 new_york_d9_b10。注意:d后面是数字,可以是任意大小。

  2. 我想部分剥离 _d* 之前的任何字符串,即只需要 _d0_b0 或 _d9_b10。

  3. 尝试了下面的代码,但显然它也删除了拆分项。

    print(("aloha_maui_d0_b0").split("_d"))
    #Output is : ['aloha_maui', '0_b0']
    #But Wanted : _d0_b0
    
  4. 还有其他方法可以获得部分吗?我需要在正则表达式中试用吗?

【问题讨论】:

    标签: python string split


    【解决方案1】:

    怎么样

    stArr = "aloha_maui_d0_b0".split("_d")
    st2 = '_d' + stArr[1]
    

    如果字符串中始终包含“_d”,这应该可以解决问题

    【讨论】:

    • 它甚至不需要在其中包含_d - 如果您使用一个函数,其中一个参数是分割字符串的分隔符,这将使其可重现。
    • @monsieuralfonse64 你的意思是这样的?我认为这也很好.. def ret_str(val): return "_d" + val.split("_d")[1]
    • @Vimo 我指的是函数参数相当于“_d”,但函数可以有两个参数——val,这是要拆分的字符串,sep,用于分割 val 的分隔符
    【解决方案2】:

    您可以使用index() 分成两部分:

    s = 'aloha_maui_d0_b0'
    idx = s.index('_d')
    l = [s[:idx], s[idx:]]
    # l = ['aloha_maui', '_d0_b0']
    

    编辑:如果您的字符串中有多个_d,您也可以使用它:

    s = 'aloha_maui_d0_b0_d1_b1_d2_b2'
    idxs = [n for n in range(len(s)) if n == 0 or s.find('_d', n) == n]
    parts = [s[i:j] for i,j in zip(idxs, idxs[1:]+[None])]
    # parts = ['aloha_maui', '_d0_b0', '_d1_b1', '_d2_b2']
    

    【讨论】:

    • 这适用于拆分为 2 的字符串,但对于任何更大的字符串,index() 将只返回“_d”的第一个索引
    【解决方案3】:

    我有两个建议。

    partition()

    使用方法partition() 获取包含分隔符作为元素之一的元组,并使用+ 运算符获取您想要的字符串:

    teste1 = 'aloha_maui_d0_b0'
    partitiontest = teste1.partition('_d')
    print(partitiontest)
    print(partitiontest[1] + partitiontest[2])
    

    输出:

    ('aloha_maui', '_d', '0_b0')
    _d0_b0
    

    partition() 方法返回一个元组,其中第一个元素是分隔符之前的内容,第二个是分隔符本身,第三个是分隔符之后的内容。

    该方法对它在字符串上找到的分隔符的第一种情况执行此操作,因此如果没有额外的代码工作,您不能使用它来拆分超过 3 个。为此,我的第二个建议会更好。

    替换()

    使用方法 replace() 在分隔符 (_d) 之前插入一个额外的字符(或多个字符),并将其用作 split() 方法的分隔符。

    teste2 = 'new_york_d9_b10'
    replacetest = teste2.replace('_d', '|_d')
    print(replacetest)
    
    splitlist = replacetest.split('|')
    print(splitlist)
    

    输出:

    new_york|_d9_b10
    ['new_york', '_d9_b10']
    

    由于它替换了 |_d 的字符串上的所有 _d 大小写,因此使用它拆分 2 个以上没有问题。

    有问题?

    您可能需要小心的情况是出现不必要的拆分,因为 _d 出现在比预期更多的地方。

    按照城市名称和数字示例的明显逻辑,您可能会有这样的情况:

    teste3 = 'rio_de_janeiro_d3_b32'
    replacetest = teste3.replace('_d', '|_d')
    print(replacetest)
    
    splitlist = replacetest.split('|')
    print(splitlist)
    

    输出:

    rio|_de_janeiro|_d3_b32
    ['rio', '_de_janeiro', '_d3_b32']
    

    假设您总是在字符串的末尾有数字并且_d 不会出现在数字内,rpartition() 可能是一个解决方案:

    rpartitiontest = teste3.rpartition('_d')
    print(rpartitiontest)
    print(rpartitiontest[1] + rpartitiontest[2])
    

    输出:

    ('rio_de_janeiro', '_d', '3_b32')
    _d3_b32
    

    由于rpartition() 在字符串的末尾开始搜索,并且只使用第一个匹配项将术语分成一个元组,因此您不必担心第一个术语(城市名称?)会导致意外拆分。

    【讨论】:

      【解决方案4】:

      使用正则表达式的拆分并保留分隔符功能:

      import re
      
      patre = re.compile(r"(_d\d)")
                          #?   ?
      #note the surrounding parenthesises - they're what drives "keep"
      
      for line in """aloha_maui_d0_b0 new_york_d9_b10""".split():
          parts = patre.split(line)
          print("\n", line)
          print(parts)
      
          p1, p2 = parts[0], "".join(parts[1:])
          print(p1, p2)
      
      

      输出:

       aloha_maui_d0_b0
      ['aloha_maui', '_d0', '_b0']
      aloha_maui _d0_b0
      
       new_york_d9_b10
      ['new_york', '_d9', '_b10']
      new_york _d9_b10
      
      

      信用到期:https://stackoverflow.com/a/15668433

      【讨论】:

        猜你喜欢
        • 2023-03-17
        • 1970-01-01
        • 2020-01-15
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 2020-06-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多