【问题标题】:How do I split without removing delimeter, if it's whitespace如果是空格,如何在不删除分隔符的情况下拆分
【发布时间】:2014-11-05 10:36:40
【问题描述】:

这就是我想要的

split('number1+number2')
-->['number1', '+', 'number2']

split('number1 * number2')
-->['number1', '*', 'number2']

我想拆分 *、+ 和 -,但保留它们。所以我尝试做re.split('(\W+)', mystring),它工作但它也保留了空格。我该怎么办?

【问题讨论】:

  • 将 map 与 re 结合起来似乎比任何纯正则表达式解决方案都快map(str.strip,re.split('([\*\-\+])', s)

标签: python regex string split


【解决方案1】:

[^\w\s] 匹配一个既不是单词字符也不是空格的字符,所以你可以使用

>>> re.split(r"\s*([^\w\s]+)\s*",'number1 * number2')
['number1', '*', 'number2']

或者,作为一个冗长的正则表达式:

re.split(
    r"""\s*   # Match (but don't capture) optional whitespace characters
    (         # Capture...
     [^\w\s]+ # one or more non-whitespace, non-alphanumeric characters
    )         # End of capturing group
    \s*       # Match (but don't capture) optional whitespace characters""", 
    'number1 * number2', flags=re.VERBOSE)

【讨论】:

    【解决方案2】:
    In [13]: import re
    
    In [14]: re.split(r'\s*([*+-])\s*',s)
    Out[14]: ['number1', '*', 'number2']
    
    In [15]: re.split(r'\s*([*+-])\s*','number1 * number2')   
    Out[15]: ['number1', '*', 'number2']
    
    In [16]: re.split(r'\s*([*+-])\s*','number1+number2')   
    Out[16]: ['number1', '+', 'number2'
    

    【讨论】:

      【解决方案3】:
      ^(.*?)\s*([+*-])\s*(.*)$
      

      它更容易匹配和抓取。参见演示。

      http://regex101.com/r/iZ9sO5/6

      【讨论】:

        【解决方案4】:

        你可以简单地使用re.findall:

        >>> s1 = 'number1+number2'
        >>> s2 = 'number1 * number2'
        >>> s3 = 'number1 * number2*number3- foo -bar'
        >>> r = re.compile(r'\w+|[*+-]')
        >>> r.findall(s1)
        ['number1', '+', 'number2']
        >>> r.findall(s2)
        ['number1', '*', 'number2']
        >>> r.findall(s3)
        ['number1', '*', 'number2', '*', 'number3', '-', 'foo', '-', 'bar']
        

        【讨论】:

          【解决方案5】:

          你可以使用 ungreedy 匹配:

          re.split("\s*(\W+?]+)\s*",'number1 * number2')
          

          正确给出['number1', '*', 'number2']

          【讨论】:

            猜你喜欢
            • 2019-01-21
            • 2013-05-10
            • 1970-01-01
            • 2020-04-09
            • 2017-10-29
            • 2019-02-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多