Python在一个空格上精确地分割字符串。如果双倍空间使"字"不是"字"

时间:2017-05-11 12:21:27

标签: python regex string split

我有以下字符串。

words = "this is a book and i like it"

我想要的是当我将它分成一个空格时,我得到以下内容。 wordList = words.split(" ") print wordList << ['this','is','a',' book','and','i',' like','it']

简单words.split(" ")函数拆分字符串,但是如果需要双倍空格,则会删除两个空格,这些空格会提供'book''like'。我需要的是' book'' like'在分割输出中保留额外的空格,以防双重,三重......空间

3 个答案:

答案 0 :(得分:5)

您可以使用后面的(?&lt; =)语法拆分空白前面没有空格的空格:

import re

re.split("(?<=\\S) ", words)
# ['this', 'is', 'a', ' book', 'and', 'i', ' like', 'it']

或类似地,使用负面看后面:

re.split("(?<!\\s) ", words)
# ['this', 'is', 'a', ' book', 'and', 'i', ' like', 'it']

答案 1 :(得分:3)

只是另一个正则表达式解决方案:如果需要使用单个最左边的空白字符串进行拆分,请使用\s?匹配一个或零个空格,然后捕获 0+剩余的空格随后的非空白字符。

一个非常重要的步骤:在运行正则表达式之前对输入字符串运行rstrip以删除所有尾随空格,否则,其性能将大大降低。

import re
words = "this is a  book and i  like it"
print(re.findall(r'\s?(\s*\S+)', words.rstrip()))
# => ['this', 'is', 'a', ' book', 'and', 'i', ' like', 'it']

查看Python demore.findall只返回捕获的子字符串,因为我们只有一个捕获组,结果就是这些捕获的列表。

此外,这是一个regex demo。详细说明:

  • \s? - 1或0(由于?量词)空格
  • (\s*\S+) - 捕获第1组匹配
    • \s* - 零或更多(由于*量词)空白
    • \S+ - 1个或更多(由于+量词)非空白符号。

答案 2 :(得分:0)

如果您不想使用正则表达式并且希望保留与您自己的代码接近的内容,则可以使用以下内容:

words = "this is a  book and i  like it"
wordList = words.split(" ")
for i in range(len(wordList)):
    if(wordList[i]==''):
        wordList[i+1] = ' ' + wordList[i+1]
wordList = [x for x in wordList if x != '']  
print wordList
# Outputs: ['this', 'is', 'a', ' book', 'and', 'i', ' like', 'it']