Python 正则表达式拆分加号或减号并保留字符

Python regex split on plus or minus and keep character

我有一组这样的数据:

data_list = ['0+.25+4.06+5.12', '0+0-.033+933.00+9+48.002']

唯一的分隔符是加号和减号。我想保留加号或减号,但仍然分开。元素前面的第一个0也不需要。

这是我目前的情况:

import re

data_list = ['0+.25+4.06+5.12', '0+0-.033+933.00+9+48.002']
data_string = ""
for item in data_list:
    data_string += item[1:]

data_string = re.split(', |\+|-', data_string)

new_data_list = []

for item in data_string:
    if item:
        new_data_list.append(item)

print(new_data_list)

这使我接近正确的输出:

['.25', '4.06', '5.12', '0', '.033', '933.00', '9', '48.002']

但现在我无法确定哪个是正面的还是负面的。

我希望输出是这样的:

['.25', '4.06', '5.12', '0', '-.033', '933.00', '9', '48.002']

我可以看到 .033 是一个负数。

您可以使用

import re
 
data_list = ['0+.25+4.06+5.12', '0+0-.033+933.00+9+48.002']
new_data_list = []
for item in data_list:
    new_data_list.extend(re.split(r'\+|(?=-)', item[2:]))
 
print(new_data_list)
# => ['.25', '4.06', '5.12', '0', '-.033', '933.00', '9', '48.002']

参见Python demo

注:

  • item[2:] - 截断前两个字符(如果您需要更精确,请将 item[2:] 替换为 re.sub(r'^0\+', '', item)
  • \+|(?=-) 匹配 + 或紧跟 - 字符的位置。

你可以试试这个列表理解:

[el for el in re.findall('[+-]\d*\.?\d+', ''.join(data_list))]

正则表达式解释:

  • [+-]: 开始符号
  • \d*: 可选数字
  • \.?: 可选点
  • \d+: 十进制数

它可以在一个 findall 中完成,无需任何循环:

import re
data_list = ['0+.25+4.06+5.12', '0+0-.033+933.00+9+48.002']

print (re.findall(r'-?(?!0+[ +])\d*\.?\d+', ' '.join(data_list)))

输出:

['.25', '4.06', '5.12', '0', '-.033', '933.00', '9', '48.002']

RegEx Demo

正则表达式详细信息:

  • -?:匹配可选-
  • (?!0+[ +]):如果输入
  • 中只有 0s,则否定前瞻会使匹配失败
  • \d*\.?\d+:匹配一个整数或浮点数