我想提取一部分以数字开头但以空格结尾的字符串。
以下是字符串:"X-DSPAM-Confidence: 0.8475 "
我想提取0.8475
,然后将其转换为float。
即使我也提取了最后一个空格(浮点转换似乎对此并不在意),我仍然可以做到这一点,并且我也知道如何摆脱左侧的空格。但是我在想,是否有一种更平滑的方法。
value = "X-DSPAM-Confidence: 0.8475 "
start = value.find("0")
print(start)
s = int(start)
end = value.find("5")
print(end)
e = int(end)
x = value[s:]
print(x)
y = float(x)
然后在我的代码中我执行[s:]
,但是我想知道我是否可以执行[s:e]
,现在我不能这样做,因为显然它将截断数字的最后一位。我希望e
是空白,所以[s:e]
很好,因为它可以切断空白。有什么建议吗?
答案 0 :(得分:0)
不查找特定数字; DSPAM置信度得分不会始终以5
结尾!您正在处理电子邮件标头,该标头将始终遵循特定的结构。最简单的形式是 name ,后跟:
冒号,后跟标题值。该名称本身不能包含冒号,因此您要做的所有事情都将:
字符后的部分分隔开。
是的,您想使用string methods Python provides。这里最好的工具是使用str.partition()
:
number = value.partition(":")[-1]
y = float(number)
这会将标头划分在第一个:
字符上,并且仅使用str.partition()
返回的3个字符中的第3个(最后一个)元素。您已经意识到float()
不在乎字符串中的空格:
>>> value = "X-DSPAM-Confidence: 0.8475 "
>>> value.partition(":")[-1]
' 0.8475 '
>>> float(value.partition(":")[-1])
0.8475
关于您自己的代码:
str.find()
始终返回整数值,无需将其再次转换为整数(不需要e = int(end)
)。e
;所以value[s:e + 1]
。但是,在您的情况下,您可能只使用了 only s
并以一个开放端进行切片:value[s:]
,因此从位置{{1} }。s
,然后使用其结果来拆分数字置信度值,但是随后您必须测试value.find(":")
(否{ {1}}发现冒号。我怀疑您正在处理电子邮件文本,但是,在这种情况下,您可以让email.parser
module为您解析 all 标头,然后只要求它正确标头。
因此,如果您正在苦苦挣扎,那么您将获得一个带有email.message_from_string()
function的电子邮件对象:
-1
演示:
:
使用该库可确保可以利用其他开发人员已经投入的工作,以使电子邮件处理正常工作。就像电子邮件标头不区分大小写一样:
from email import message_from_string
msg = message_from_string(full_email_text)
confidence = msg.get("X-DSPAM-Confidence")
if confidence is not None:
value = float(confidence)
答案 1 :(得分:0)
这是一个非常基本的解决方案,更接近您的尝试:
y = float(value[value.find(':')+1:])
它仅转换第一个:
之后的剩余子字符串,当然,仅在:
之后仅跟一个数字且其周围带有可选空格的情况下有效。
答案 2 :(得分:-1)
rstrip()函数将在右侧修剪空白。
答案 3 :(得分:-1)
您可以将字符串拆分为已知字符并去除空格
string = "X-DSPAM-Confidence: 0.8475 "
numberString = string.split(":")[1].strip(" ") #'0.8475'
number = float(numberString) #0.8475
print(number)
答案 4 :(得分:-1)
如果文本的格式始终与您给出的示例相同,那么这样做会容易得多:
a b c d
1 1 1 1
_ 1 _ 1
Ps:给变量命名已存在的东西不是一个好主意
答案 5 :(得分:-1)
由于没有人使用正则表达式得到答案:
float(str.split(" ")[1])