169

我有表格形式的命令输出。我正在从结果文件解析此输出并将其存储在字符串中。一行中的每个元素都由一个或多个空格字符分隔,因此我使用正则表达式来匹配 1 个或多个空格并将其拆分。但是,在每个元素之间插入了一个空格:

>>> str1="a    b     c      d" # spaces are irregular
>>> str1
'a    b     c      d'
>>> str2=re.split("( )+", str1)
>>> str2
['a', ' ', 'b', ' ', 'c', ' ', 'd'] # 1 space element between!!!

有一个更好的方法吗?

每次拆分后都str2附加到一个列表中。

4

4 回答 4

203

通过使用(, ),您正在捕获组,如果您只是删除它们,您将不会遇到此问题。

>>> str1 = "a    b     c      d"
>>> re.split(" +", str1)
['a', 'b', 'c', 'd']

但是,不需要正则表达式,str.split如果没有指定任何分隔符,它将为您用空格分隔。在这种情况下,这将是最好的方法。

>>> str1.split()
['a', 'b', 'c', 'd']

如果你真的想要正则表达式,你可以使用它('\s'代表空格,它更清晰):

>>> re.split("\s+", str1)
['a', 'b', 'c', 'd']

或者您可以找到所有非空白字符

>>> re.findall(r'\S+',str1)
['a', 'b', 'c', 'd']
于 2012-06-11T05:44:21.060 回答
27

str.split方法将自动删除项目之间的所有空白:

>>> str1 = "a    b     c      d"
>>> str1.split()
['a', 'b', 'c', 'd']

文档在这里:http ://docs.python.org/library/stdtypes.html#str.split

于 2012-06-11T05:44:17.073 回答
8

当您使用re.split并且拆分模式包含捕获组时,这些组将保留在输出中。如果您不想这样做,请改用非捕获组。

于 2012-06-11T05:43:00.763 回答
2

其实很简单。尝试这个:

str1="a    b     c      d"
splitStr1 = str1.split()
print splitStr1
于 2012-06-11T05:47:01.813 回答