(Python)仅在分隔符的单个实例上拆分字符串

(Python)仅在分隔符的单个实例上拆分字符串,python,regex,string,Python,Regex,String,我正在尝试从使用破折号作为分隔符的文本字符串中提取数值,但也用于指示负值: "1.3" # [1.3] "1.3-2-3.9" # [1.3, 2, 3.9] "1.3-2--3.9" # [1.3, 2, -3.9] "-1.3-2--3.9" # [-1.3, 2, -3.9] 目前,我正在手动检查“-”序列,但这看起来真的很难看,而且很容易中断 def get_values(text): return map(lambda s: s.replace(

我正在尝试从使用破折号作为分隔符的文本字符串中提取数值,但也用于指示负值:

"1.3"          # [1.3]
"1.3-2-3.9"    # [1.3, 2, 3.9]
"1.3-2--3.9"   # [1.3, 2, -3.9]
"-1.3-2--3.9"  # [-1.3, 2, -3.9]
目前,我正在手动检查“-”序列,但这看起来真的很难看,而且很容易中断

def get_values(text):
    return map(lambda s: s.replace('n', '-'), text.replace('--', '-n').split('-'))
我尝试了几种不同的方法,使用str.split()函数和re.findall(),但没有一种有效

例如,以下模式应匹配所有有效字符串,但我不确定如何将其与findall一起使用:

r"^-?\d(\.\d*)?(--?\d(\.\d*)?)*$"

有没有一种我没有看到的通用方法?谢谢

您可以尝试使用此模式进行拆分,并使用lookback:

(?<=[0-9])-
(?>>导入re

>>>关于拆分(“(?您可以尝试使用此模式进行拆分,并使用lookback:

(?<=[0-9])-
(?>>导入re

>>>关于split(“(?@casimimirithippolyte)给出了一个非常优雅的正则表达式解决方案,但我想指出的是,只需一个

此外,如果您使用,您将看到此解决方案比使用正则表达式快很多:

>>> from timeit import timeit
>>>
>>> # With Regex
>>> def get_values(text):
...     import re
...     return re.split('(?<=[0-9])-', text)
...
>>> timeit('get_values("-1.3-2--3.9")', 'from __main__ import get_values')
9.999720634885165
>>>
>>> # Without Regex
>>> def get_values(text):
...     it = iter(text.split("-"))
...     return [x or "-"+next(it) for x in it]
...
>>> timeit('get_values("-1.3-2--3.9")', 'from __main__ import get_values')
4.145546989910741
>>>
>>>从timeit导入timeit
>>>
>>>#带正则表达式
>>>def get_值(文本):
…进口稀土

…return re.split(“(?@casimirithippolyte提供了一个非常优雅的正则表达式解决方案,但我想指出,您只需一个

此外,如果您使用,您将看到此解决方案比使用正则表达式快很多:

>>> from timeit import timeit
>>>
>>> # With Regex
>>> def get_values(text):
...     import re
...     return re.split('(?<=[0-9])-', text)
...
>>> timeit('get_values("-1.3-2--3.9")', 'from __main__ import get_values')
9.999720634885165
>>>
>>> # Without Regex
>>> def get_values(text):
...     it = iter(text.split("-"))
...     return [x or "-"+next(it) for x in it]
...
>>> timeit('get_values("-1.3-2--3.9")', 'from __main__ import get_values')
4.145546989910741
>>>
>>>从timeit导入timeit
>>>
>>>#带正则表达式
>>>def get_值(文本):
…进口稀土

…return re.split(“(?我喜欢你的
get_values
,事实上。这是一个简单易读的单行程序,可以很好地隐藏底层数据结构的糟糕设计。事实上,我刚刚意识到get_values()在字符串以破折号开头时会中断。它最终会给出(“,'1.3','2','-3.9'))对于第四个例子,它是一个可修复的,但它会涉及到另一层乱码…实际上,我喜欢你的
get_values
。一个简单易读的一行代码,它很好地隐藏了底层数据结构的糟糕设计。实际上,我刚刚意识到,当字符串以破折号开头时get_values()会中断。它最终会放弃(''1.3','2','-3.9')用于第四个示例。这是一个可修复的,但它会涉及另一层混乱…@Tiro:真为你高兴!但看看更快的iCodez解决方案。@Tiro:为你高兴!但看看更快的iCodez解决方案。对于这个特定项目,速度不是一个主要因素(至少,不是这个组件),但这是很好的了解。感谢替代方法!对于此特定项目,速度不是主要因素(至少,不是此组件),但这是很好的了解。感谢替代方法!