【问题标题】:re.split with spaces in python在python中用空格重新分割
【发布时间】:2016-05-02 13:08:54
【问题描述】:

我有一串如下所示的文本:

'                     19,301         14,856        18,554'

空格在哪里。

我试图在空白处拆分它,但我需要将所有空白保留为新列表中的一个项目。像这样:

['                     ', '19,301','        ', '14,856', '        ', '18,554']

我一直在使用以下代码:

re.split(r'( +)(?=[0-9])', item)

它返回:

['', '                     ', '19,301', '        ', '14,856', '        ', '18,554']

请注意,它总是在我的列表开头添加一个空元素。删除它很容易,但我真的很想了解这里发生了什么,所以我可以获得代码来一致地处理事情。谢谢。

【问题讨论】:

  • 恕我直言,使用\s 会使它不那么清晰,如果这里有人想真正尝试一下,就会很烦人。
  • @StefanPochmann 同意。这更难处理

标签: python regex split


【解决方案1】:

使用re.split 方法时,如果捕获组在字符串开头匹配,则为“result will start with an empty string”。这样做的原因是join 方法可以表现得与split 方法相反。

这对于您的情况可能没有多大意义,分隔符匹配的大小不同,但如果您考虑分隔符是| 字符的情况,并且您想对它们执行连接,使用额外的空字符串就可以了:

>> item = '|19,301|14,856|18,554'
>> items = re.split(r'\|', item)
>> print items
['', '19,301', '14,856', '18,554']
>> '|'.join(items)
'|19,301|14,856|18,554'

但没有它,初始管道将丢失:

>> items = ['19,301', '14,856', '18,554']
>> '|'.join(items)
'19,301|14,856|18,554'

【讨论】:

    【解决方案2】:

    您可以使用re.findall()

    >>> s = '\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s19,301\s\s\s\s\s\s\s\s\s14,856\s\s\s\s\s\s\s\s18,554'.replace('\\s',' ')
    >>> re.findall(r' +|[^ ]+', s)
    ['                     ', '19,301', '         ', '14,856', '        ', '18,554']
    

    您在问题中说“空格”,因此该模式适用于空格。对于匹配运行的任何空白字符,您可以使用:

    >>> re.findall(r'\s+|\S+', s)
    ['                     ', '19,301', '         ', '14,856', '        ', '18,554']
    

    模式匹配一​​个或多个空白字符一个或多个非空白字符,例如:

    >>> s='  \t\t  ab\ncd\tef   g '
    >>> re.findall(r'\s+|\S+', s)
    ['  \t\t  ', 'ab', '\n', 'cd', '\t', 'ef', '   ', 'g', ' ']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 2012-11-12
      • 2012-09-22
      相关资源
      最近更新 更多