在Python中解析以空格结尾的字符串

时间:2019-07-12 18:09:03

标签: python

我想提取一部分以数字开头但以空格结尾的字符串。

以下是字符串:"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]很好,因为它可以切断空白。有什么建议吗?

6 个答案:

答案 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])