python去除字符串中非数字字符,如何通过python去除数字字符串中的前后字符
python去除字符串中非数字字符,如何通过python去除数字字符串中的前后字符后面重新整理实现思路,位置不固定 前、后"##@1.23abc" "#1.23##" "###123##"我们知道python本身有strip方法可以去除特殊字符,但前提是这个特殊字符是可知的,固定的。而对于我说的那些不固定字符的情况就无法很好处理了。所以只能自己想办法处理了,当然我这个也是笨办法,要不是适合所有的场景。这个思路不是一下想出来的,开始是直接把字符串一个遍历,取出判断是不是数字,一直找到不是数字的位置截断,但是这个无法处理开始就是字符的场景,只能去掉后面是字符串的。
需求场景这个是在通过OCR或者其他文字识别工具接口,识别到的数据中包含不需要的字符。而我们只想只要识别的数字,当然这个本身识别结果可能也不是对,那就是另外的问题了。而这里我们假设我们识别到的数据,是包含了我们需要的数据的,那么我们怎么通过python去掉那些多余的字符串了。
这就有几个问题。
字符串不固定,普通字符、特殊字符 比如: ¥ % @ a b c
长度不固定,0、1个、多个
位置不固定 前、后
"##@1.23abc"
"#1.23##"
"###123##"
我们知道python本身有strip方法可以去除特殊字符,但前提是这个特殊字符是可知的,固定的。而对于我说的那些不固定字符的情况就无法很好处理了。所以只能自己想办法处理了,当然我这个也是笨办法,要不是适合所有的场景。
实现思路这个思路不是一下想出来的,开始是直接把字符串一个遍历,取出判断是不是数字,一直找到不是数字的位置截断,但是这个无法处理开始就是字符的场景,只能去掉后面是字符串的。
后面重新整理实现思路,
- 判断字符串是否存在数字字符,
- 变量字符串是否是数字,保存索引在列表中。
- 通过数字索引和字符串,判断数字是不是连续的,只取第一个连续的数字。
def findNumV2(str):
# 去除前后的特殊字符,但是如果开始有两段数字,只会得到第一段数字
res= r"\d [\.]?\d "
result = re.compile(res)
strint = result.search(str)
return strint.group()# 返回第一个识别的数字的
实现方法
def Isint(v):
try:
newv = int(v)
except Exception as e:
return False
return True
def IsFloat(v):
try:
newv = float(v)
except Exception as e:
return False
return True
def hasNum(v):
# numstr =["0"]
# 判断字符串是否包含数字
for i in range(9):
if str(i) in v:
return True
return False
def valueStripv2(v):
# 去除前后的特殊字符,但是如果开始有两段数字,只会得到第一段数字
l = len(v)
if not hasNum(v):
return ""
numlist = []
if Isint(v):
return v
elif IsFloat(v):
return v
else:
return findNumV2(v)
def findNum(indexlist v):
# 把字符串中第一段数字找出来
for i in range(1 len(indexlist)):
newv = v[indexlist[0]:indexlist[i]]
if "." in v:
if IsFloat(newv):
if indexlist[i] == indexlist[-1]:
# 数字索引是连续的,取到索引列表的当前,但是字符串索引要 1 因为indexlist 的值存的是字符串里面的索引值
newv = v[indexlist[0]:indexlist[i] 1]
return newv
else:
continue
else:
# 数字索引不是连续的,取到索引列表的前一个,但是字符串索引要 1 因为indexlist 的值存的是字符串里面的索引值
newv = v[indexlist[0]:indexlist[i - 1] 1]
return newv
else:
if Isint(newv):
if indexlist[i] == indexlist[-1]:
# 到最后了
# 数字索引是连续的,取到索引列表的当前,但是字符串索引要 1 因为indexlist 的值存的是字符串里面的索引值
newv = v[indexlist[0]:indexlist[i] 1]
return newv
else:
continue
else:
# 数字索引不是连续的,取到索引列表的前一个,但是字符串索引要 1 因为indexlist 的值存的是字符串里面的索引值
newv = v[indexlist[0]:indexlist[i-1] 1]
return newv
def findNumV2(str):
# 正则处理
# 去除前后的特殊字符,但是如果开始有两段数字,只会得到第一段数字
res= r"\d [\.]?\d "
result = re.compile(res)
strint = result.search(str)
return strint.group()# 返回第一个识别的数字的
def teststrip():
# 测试函数
s = ["!" "@" "#" "$" "%" "^" "&" "*" "?" " " "↓"]
for i in s:
s1 = i "123" i*3
s2 = i*3 "12.3" i
s3 = "12.3" i*3
s4 = i*3 "12.3"
print(s1 ">>>>>" valueStripv2(s1))
print(s2 ">>>>>" valueStripv2(s2))
print(s3 ">>>>>" valueStripv2(s3))
print(s4 ">>>>>" valueStripv2(s4))
if __name__ == '__main__':
teststrip()
实现结果