Python - re.split:开头和结尾列表的额外空字符串

时间:2015-06-18 19:50:37

标签: python regex

我正在尝试使用一串int和/或浮点数并创建一个浮点列表。字符串将在其中包含需要忽略的括号。我正在使用re.split,但如果我的字符串以括号开头和结尾,我会得到额外的空字符串。那是为什么?

代码:

import re
x = "[1 2 3 4][2 3 4 5]"
y =  "1 2 3 4][2 3 4 5"
p = re.compile(r'[^\d\.]+')
print p.split(x)
print p.split(y)

输出:

['', '1', '2', '3', '4', '2', '3', '4', '5', '']
['1', '2', '3', '4', '2', '3', '4', '5']

5 个答案:

答案 0 :(得分:4)

如果使用re.split,则字符串开头或结尾的分隔符会在结果的数组的开头或结尾处生成一个空字符串。

如果您不想这样做,请使用re.findall,其正则表达式与每个不包含分隔符的序列匹配。

示例:

import re

a = '[1 2 3 4]'
print(re.split(r'[^\d]+', a))
print(re.findall(r'[\d]+', a))

输出:

['', '1', '2', '3', '4', '']
['1', '2', '3', '4']

正如其他人在他们的回答中指出的那样,这可能不是解决这个问题的完美解决方案,但它是问题标题中描述的问题的一般答案,我在这个问题时也必须解决这个问题。我使用Google发现了这个问题。

答案 1 :(得分:1)

作为一种更加pythonic的方式,您可以使用列表理解和str.isdigit()方法检查您的角色是否为数字:

>>> [i for i in y if i.isdigit()]
['1', '2', '3', '4', '2', '3', '4', '5']

关于你的代码首先你需要根据空格或括号进行拆分,这可以用[\[\] ]来完成,并且为了摆脱前导和尾随括号的空字符串,你可以先{{1}你的字符串:

strip

您还可以使用>>> y = "1 2 3 4][2 3 4 5" >>> re.split(r'[\[\] ]+',y) ['1', '2', '3', '4', '2', '3', '4', '5'] >>> y = "[1 2 3 4][2 3 4 5]" >>> re.split(r'[\[\] ]+',y) ['', '1', '2', '3', '4', '2', '3', '4', '5', ''] >>> re.split(r'[\[\] ]+',y.strip('[]')) ['1', '2', '3', '4', '2', '3', '4', '5'] 函数并使用filter函数包装结果。

bool

答案 2 :(得分:1)

您可以使用Set dict = GetValues(hc3.Offset(1, 0)) If dict.count > 0 Then 'add the values to the master list, column 2 Set d = StartSht.Cells(Rows.count, hc1.Column).End(xlUp).Offset(1, 0) d.Resize(dict.count, 1).Value = Application.Transpose(dict.items) Else 'if no items are under the HOLDER header StartSht.Range(StartSht.Cells(i, 2), StartSht.Cells(GetLastRowInColumn(StartSht, "C"), 1)) = " NO ITEMS " End If 来避免空结果:

filter

答案 3 :(得分:0)

import re
str= "[1 2 3 4][2 3 4 5]"
print re.findall(r'\d+', str)
str= "1 2 3 4][2 3 4 5"
print re.findall(r'\d+', str)

答案 4 :(得分:0)

您可以使用正则表达式捕获所需的内容,而不是拆分字符串。你可以使用这个正则表达式:

(\d+)

<强> Working demo

enter image description here

Python代码:

import re
p = re.compile(ur'(\d+)')
test_str = u"[1 2 3 4][2 3 4 5]"

re.findall(p, test_str)