如何在点后分割字符串,除非点后的字符是数字

时间:2019-06-03 22:14:29

标签: python-3.x

我只需要在字符串的开头使用字母和数字,但是有些数字是小数。字符串的格式并非全部相同。以下是一些数据的一些示例以及我需要返回的内容:

HB61 .M16 1973我需要退还HB61

HB97.52 .R6163 1982我需要退回HB97.52

HB98.V38 1994我需要退还HB98

HB 119.G74 A3 2007我需要退回HB119

我对编码非常陌生,所以希望有一些我不知道的简单解决方案?

我只是将其分割为第一个点,然后去除空格,但这不允许我保留我需要的小数,例如HB97.52。我目前编写的代码只是一次测试一个字符串。代码如下:

clientel

除了带小数的字符串外,这可以按预期工作。对于HB97.52 .R6163 1982,我希望返回HB97.52,但仅返回HB97。

2 个答案:

答案 0 :(得分:4)

以下正则表达式提取字符串开头的字母,后跟可选空格,后跟[可能是浮点数]数字:

s = ['HB61 .M16 1973', 'HB97.52 .R6163 1982', 
     'HB98.V38 1994', 'HB 119.G74 A3 2007']

import re
pattern = r"^[a-z]+\s*\d+(?:\.\d+)?"
[re.findall(pattern, part, flags=re.I)[0] for part in s]
#['HB61', 'HB97.52', 'HB98', 'HB 119']

如果您不希望在输出中使用空格,则此稍有不同的模式将分别提取字母部分和数字部分,然后将它们连接起来:

pattern = r"(^[a-z]+)\s*(\d+(?:\.\d+)?)"
list(map("".join, [re.findall(pattern, part, flags=re.I)[0] for part in s]))
#['HB61', 'HB97.52', 'HB98', 'HB119']

答案 1 :(得分:0)

对于诸如HB61.45.78.R5000之类的产品,您想要什么?如果您想要HB61.45.78,请使用以下第一段代码:

data = data.replace(' ', '')
data = data.split('.')
wanted = data[0]
for i in range(1,len(data)):
   if data[i][0].isalpha():
      break
   else:
      wanted += '.' + data[i]

否则,如果只需要HB61.45,请使用

data = data.replace(' ', '')
data = data.split('.')
wanted = data[0]
if not data[1][0].isalpha():
   wanted += '.' + data[1]