我想做的是:
找出字符串中的所有数值。你知道吗
input_string = "高露潔光感白輕悅薄荷牙膏100 79.80"
numbers = re.finditer(r'[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?',input_string)
for number in numbers:
print ("{} start > {}, end > {}".format(number.group(), number.start(0), number.end(0)))
'''Output'''
>>100 start > 12, end > 15
>>79.80 start > 18, end > 23
然后我想把所有的整数和浮点值替换成某种格式:
INT_(number of digit)
和FLT(number of decimal places)
例如100 -> INT_3 // 79.80 -> FLT_2
因此,expect输出字符串如下所示:
"高露潔光感白輕悅薄荷牙膏INT_3 FLT2"
但是Python中的string replace substring方法有点奇怪,它不能存档我想做的事情。你知道吗
所以我尝试使用substring-append-substring方法
string[:number.start(0)] + "INT_%s"%len(number.group()) +.....
这看起来很愚蠢,而且最重要的是我仍然不能让它工作。你知道吗
有人能就这个问题给我一些建议吗?你知道吗
你需要把正则表达式的各个部分像这样分组
float
或int
).
之前的任何数字,如果.
本身存在,则它是None
.
后面的所有数字,如果它存在,否则它就是所有数字None
你可以从中得到一个python数字
您可能正在寻找下面的代码(当然还有其他方法)。这一个只是从你正在做的事情开始,并展示如何做到这一点。你知道吗
这看起来可能有点复杂,因为确实有几个简单的问题需要解决。你知道吗
例如,您最初的正则表达式会同时找到int和float,但是您需要在之后应用完全不同的替换。如果你一次只做一件事,这会更简单。但是,由于float的某些部分可能看起来像int,一次执行所有操作可能不是一个坏主意,您只需了解这将导致二次检查来区分这两种情况。你知道吗
另一个更基本的问题是,实际上您不能替换python字符串中的任何内容。Python字符串是不可修改的对象,因此您必须创建一个副本。无论如何,这是好的,因为格式更改可能需要插入或删除字符,而就地替换将没有效率。你知道吗
最后一个需要考虑的问题是,替换必须向后进行,因为如果更改字符串的开头,匹配位置也会更改,下一个替换将不在正确的位置。如果我们向后做,一切都好。你知道吗
当然,我同意使用
re.sub()
要简单得多。你知道吗使用
re.sub
和内部的回调方法,可以对匹配项执行各种操作:参见Python demo
详细信息:
([0-9]*\.?[0-9]+)
)上有一个捕获组,这将在repl
方法中进行分析repl
方法中,第1组内容被.
拆分,以查看是否有浮点/双精度,如果是,则返回小数部分的长度,否则返回整数的长度。你知道吗相关问题 更多 >
编程相关推荐