【问题标题】:Find the sub-string after nth '|'查找第 n 个 '|' 之后的子字符串
【发布时间】:2015-01-16 17:26:49
【问题描述】:

给定一个字符串如下:

1|2||||auc|0|1||0|||76u|
      ^ 

在第 5 个“|”之后返回子字符串的最有效方法是什么? 例如,给定上面的字符串,结果应该是:

auc|0|1||0|||76u|

【问题讨论】:

    标签: python python-2.7 split


    【解决方案1】:

    使用str.split:

    s = '1|2||||auc|0|1||0|||76u|'
    print s.split('|', 5)[-1]
    # auc|0|1||0|||76u|
    

    注意,如果|s 少于 5 个,这可能会导致不希望的结果,例如,

    '1|2'.split('|', 5)[-1]
    # returns 2 - which isn't *after* the 5th
    

    存在于字符串中,因此您可能希望将其包装在 try/except 中并强制处理|s 不足的情况,以便 5 号之后 的结果为空的,因为没有 5 个在场。

    try:
        rest = s.split('|', 5)[5]
    except IndexError:
        rest = ''
    

    【讨论】:

    • 漂亮干净的解决方案。如果我可以为记录添加一些有希望的常识:如果您有充分的理由期望大部分字符串的管道少于五个,您可能希望先拆分并检查结果的长度而不是捕获错误.
    【解决方案2】:

    使用带有限制的str.split() method(第二个参数):

    input_string.split('|', 5)[-1]
    

    这会将字符串拆分 5 次,并取最后一个元素,其中剩余的 | 字符未拆分。

    如果字符串中的| 字符少于 个,您仍然会从拆分中获得最后一个元素,因为[-1] 从末尾开始计数。这意味着即使拆分中有 个管道符号,表达式也会继续工作。

    演示:

    >>> input_string = '1|2||||auc|0|1||0|||76u|'
    >>> input_string.split('|', 5)
    ['1', '2', '', '', '', 'auc|0|1||0|||76u|']
    >>> input_string.split('|', 5)[-1]
    'auc|0|1||0|||76u|'
    

    并引用文档:

    如果给出 maxsplit,则最多完成 maxsplit 个拆分(因此,列表最多有 maxsplit+1 个元素)。

    【讨论】:

      【解决方案3】:
      def get_substring(my_string):
          count = 0
          for i, char in enumerate(my_string):
              if char == '|':
                  count += 1
                  if count == 5:
                      return my_string[i+1:]
      

      【讨论】:

        【解决方案4】:
        s = '1|2||||auc|0|1||0|||76u|'
        sre =  re.compile('([^|]*)(' + r*4 + ')(.*)')
        
        sre.search(s).groups()
        Out[39]: ('1', '|2|||', '|auc|0|1||0|||76u|')
        
        sre.search(s).group(3)[1:]
        Out[40]: 'auc|0|1||0|||76u|'
        

        【讨论】:

          猜你喜欢
          • 2018-08-24
          • 2010-12-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多