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']
正则表达式详细信息:
-?
:匹配可选-
(?!0+[ +])
:如果输入 中只有 0
s,则否定前瞻会使匹配失败
\d*\.?\d+
:匹配一个整数或浮点数
我有一组这样的数据:
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']
正则表达式详细信息:
-?
:匹配可选-
(?!0+[ +])
:如果输入 中只有 \d*\.?\d+
:匹配一个整数或浮点数
0
s,则否定前瞻会使匹配失败