[英]Python: Remove 0s from floats in string
我正在尋找一種方法,從字符串中的所有浮點數中刪除所有無用的零。 所以我將1.0*2.40*abc+1
變成1*2.4*abc+1
。 我現在有兩種方法可以解決此問題,一種可以解決另一個問題:
re.sub(r'(?<=\d)\.?0+\b', "", my_string)
#Problem: It shorts 10 to 1 (for example)
re.sub(r'(?<=\d)\.0+\b', "", my_string)
#Problem: It doesn't short 2.40 (for example)
如果您不知道我在說什么,請隨時提問。
您可以使用函數作為替換來執行正則表達式替換:
repl=lambda x: x.group(1) + (x.group(2).rstrip('0').rstrip('.'))
re.sub('(?<!\d)(\d+)(\.\d*)(?!\d)',repl,string)
當然,它比復雜得多的RE更容易。 提前查找現在是可選的,但它們不會更改您得到的匹配項。
>>> for testcase in ('1','1.','1.0','1.01','1.01000','0.00','0.100','1.0*2.40*abc+1','100.000','100.0100','20.020','200.'):
... print('{:16s} --> {}'.format(testcase, re.sub('(?<!\d)(\d+)(\.\d*)(?!\d)',repl,testcase)))
...
1 --> 1
1. --> 1
1.0 --> 1
1.01 --> 1.01
1.01000 --> 1.01
0.00 --> 0
0.100 --> 0.1
1.0*2.40*abc+1 --> 1*2.4*abc+1
100.000 --> 100
100.0100 --> 100.01
20.020 --> 20.02
200. --> 200
您正在使用后向模式(`(?<= ...)構造)。 那在這里行不通。 您需要做的是尋找“無關緊要的”零。 100中的兩個零。100.0100中的最后兩個零並不重要。 需要注意的一些事項:
100-> 100
這必須保持不變(當然必須為“ 0”)。
100.0000-> 100
這里要刪除尾隨零和小數點。
100.0100-> 100.01這里要保留小數點和所有小數位直到'1'。
.1000-> .1
此處小數點前沒有前導數字。
一個(不太完全)簡單的正則表達式可以解決這個問題:
re.sub('(\d\.|\.\d*[1-9])0+(?!\d)',r'\1',string)
演示: https : //ideone.com/9MVIlC
弦從哪里來? 也許最好從一開始就以所需的格式生成它,而不是嘗試在以后解析它。 例如...不是一個完整的解決方案,因為我不知道您可能擁有的值的范圍。 在Python網站上查看Python的迷你格式語言,了解您所使用的python版本。 格式部分中的數字等顯然可以用變量替換
>>> "{:3.0f}*{:3.1f}*{}+{:<3.0F}".format(1.000,2.40000,"abc",1e0)
' 1*2.4*abc+1
這是(IMO)避免復雜正則表達式的最簡單方法。 假定所有表達式都用+,-,*或/分隔。
def strip(s):
if s.find('.') != -1:
s= s.rstrip('0')
if s[-1] == '.': s = s[:-1]
return s
else:
return s
s = raw_input() + '+'
accum = ''
out = ''
for i in range(len(s)):
if s[i] in "+-/*":
out = out + strip(accum) + s[i]
accum = ''
else:
accum = accum + s[i]
print out[:-1]
好吧,如果您不想使用re
庫,則只需執行此操作即可。 這是一個老把戲。
string = <your_string_with_zeroes>
string_new = []
for i in list(string):
if i!='0':
string_new.append(i)
print(''.join(string_new))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.