我想将字符串拆分为数字和文本/符号部分 我当前的代码不包含负数或小数,并且行为奇怪,在输出的末尾添加一个空列表元素
import re
mystring = 'AD%5(6ag 0.33--9.5'
newlist = re.split('([0-9]+)', mystring)
print (newlist)
当前输出:
['AD%', '5', '(', '6', 'ag ', '0', '.', '33', '--', '9', '.', '5', '']
期望的输出:
['AD%', '5', '(', '6', 'ag ', '0.33', '-', '-9.5']
答案 0 :(得分:3)
您的问题与以下事实有关:您的正则表达式捕获一个或多个数字并将其添加到结果列表中,并且数字用作分隔符,考虑前后部分。因此,如果末尾有数字,则拆分会导致末尾的空字符串被添加到结果列表中。
您可以使用匹配浮点数或整数的正则表达式与可选的减号进行拆分,然后删除空值:
result = re.split(r'(-?\d*\.?\d+)', s)
result = filter(None, result)
要将负数/正数与指数匹配,请使用
r'([+-]?\d*\.?\d+(?:[eE][-+]?\d+)?)'
-?\d*\.?\d+
正则表达式匹配:
-?
- 可选的减号\d*
- 0+位数\.?
- 可选的文字点\d+
- 一位或多位数。答案 1 :(得分:1)
不幸的是,re.split()
没有提供“忽略空字符串”选项。但是,要检索您的号码,您可以轻松地使用re.findall()
使用不同的模式:
import re
string = "AD%5(6ag0.33-9.5"
rx = re.compile(r'-?\d+(?:\.\d+)?')
numbers = rx.findall(string)
print(numbers)
# ['5', '6', '0.33', '-9.5']
答案 2 :(得分:1)
如前所述,没有选项可以忽略re.split()
中的空字符串,但您可以通过以下方式轻松构建新列表:
import re
mystring = "AD%5(6ag0.33--9.5"
newlist = [x for x in re.split('(-?\d+\.?\d*)', mystring) if x != '']
print newlist
输出:
['AD%', '5', '(', '6', 'ag', '0.33', '-', '-9.5']