【问题标题】:How do I split a string at a separator unless that separator is followed by a certain pattern?如何在分隔符处拆分字符串,除非该分隔符后跟特定模式?
【发布时间】:2017-05-04 21:39:23
【问题描述】:

我有一个 Python 字符串

string = aaa1bbb1ccc1ddd

我想这样拆分

re.split('[split at all occurrences of "1", unless the 1 is followed by a c]', string)

所以结果是

['aaa', 'bbb1ccc', 'ddd']

我该怎么做?

【问题讨论】:

  • 使用否定的前瞻断言:1(?!c)(1 后不跟 c)
  • re.split("1(?!c)", "aaa1bbb1ccc1ddd")

标签: python regex split


【解决方案1】:

对正则表达式和re 模块使用负前瞻:

>>> string = 'aaa1bbb1ccc1ddd'
>>> import re
>>> re.split(r"1(?!c)", string)
['aaa', 'bbb1ccc', 'ddd']

【讨论】:

    【解决方案2】:
    def split_by_delim_except(s, delim, bar):
        escape = '\b'
        find = delim + bar
        return map(lambda s: s.replace(escape, find),
                   s.replace(find, escape).split(delim))
    
    split_by_delim_except('aaa1bbb1ccc1ddd', '1', 'c')
    

    【讨论】:

      【解决方案3】:

      虽然不如正则表达式漂亮,但我的以下代码返回相同的结果:

      string = 'aaa1bbb1ccc1ddd'
      

      在 '1' 的所有实例处拆分字符串

      p1 = string.split('1')
      

      创建一个新的空列表,以便我们可以将所需的项目附加到

      new_result = []
      
      count = 0
      for j in p1:
      
          if j.startswith('c'):
      
              # This removes the previous element from the list and stores it in a variable.
              prev_element = new_result.pop(count-1)
      
              prev_one_plus_j = prev_element + '1' + j
      
              new_result.append(prev_one_plus_j)
      
          else:
              new_result.append(j)
      
          count += 1
      
      print (new_result)
      

      输出:

      ['aaa', 'bbb1ccc', 'ddd']

      【讨论】:

      • 这会遍历迭代器两次(一次执行string.split('1'),一次处理p1)并且内存占用翻倍。正则表达式是执行此操作的更好方法。
      • 谢谢@MatthewCole,这很有意义。学好正则表达式真的很有用!
      猜你喜欢
      • 1970-01-01
      • 2019-04-04
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 2021-12-17
      相关资源
      最近更新 更多