Python正则表达式将字符串拆分为数字和文本/符号

时间:2017-04-05 16:59:04

标签: python regex parsing

我想将字符串拆分为数字和文本/符号部分 我当前的代码不包含负数或小数,并且行为奇怪,在输出的末尾添加一个空列表元素

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']

3 个答案:

答案 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']