Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中解析以空格结尾的字符串_Python - Fatal编程技术网

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

在Python中解析以空格结尾的字符串,python,Python,我想提取字符串中以数字开头但以空格结尾的部分 以下是字符串:“X-DSPAM-Confidence:0.8475” 我想提取0.8475,然后将其转换为float 我可以做到这一点,即使我也提取了最后一个空格(浮点转换似乎并不关心这个),而且我还知道如何去除左侧的空格。但我想知道,是否有一个更平滑的方法 value=“X-DSPAM-Confidence:0.8475” 开始=值。查找(“0”) 打印(开始) s=int(开始) 结束=值。查找(“5”) 列印(完) e=int(结束) x=值[

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

以下是字符串:
“X-DSPAM-Confidence:0.8475”
我想提取
0.8475
,然后将其转换为float

我可以做到这一点,即使我也提取了最后一个空格(浮点转换似乎并不关心这个),而且我还知道如何去除左侧的空格。但我想知道,是否有一个更平滑的方法

value=“X-DSPAM-Confidence:0.8475”
开始=值。查找(“0”)
打印(开始)
s=int(开始)
结束=值。查找(“5”)
列印(完)
e=int(结束)
x=值[s:]
打印(x)
y=浮动(x)

在我的代码中,我会做
[s::
,但我想知道我是否能做
[s:e]
,而现在我做不到,因为它显然会切断数字的最后一位。我希望
e
是空白,因此
[s:e]
很好,因为它可以删除空白。任何建议?

rstrip()函数都会修剪右边的空白。

不要查找特定的数字;DSPAM置信度得分并不总是以
5
结束!您正在处理一个电子邮件头,它总是遵循特定的结构。在最简单的形式中,它将有一个名称,后跟一个
冒号,后跟标题值。名称本身不能包含冒号,因此只需将
字符后面的部分分隔开即可

所以,是的,你想使用。这里最好的工具是使用:

这将在第一个
字符上对标头进行分区,并仅使用
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
    ;所以
    值[s:e+1]
    。但是,在您的例子中,您可以只使用
    s
    并用一个开口端进行切片:
    value[s://code>,然后从位置
    s
    获取字符串的其余部分
  • 您可以使用
    值。查找(“:”
    ,然后使用其结果分割出数值置信值,但随后必须测试
    -1
    (未找到
    冒号)
我怀疑您正在处理电子邮件文本,但是,在这种情况下,您可以让管理员为您处理所有标题解析,并要求它提供正确的标题

因此,如果您有as-tring,则可以创建一个包含以下内容的电子邮件对象:

演示:

使用该库可以确保能够利用其他开发人员已经投入的工作来正确地处理电子邮件。就像电子邮件标题不区分大小写一样:

>>> msg.get("X-DSPAM-Confidence")
'0.8475 '
>>> msg.get("x-dspam-confidence")
'0.8475 '
>>> msg.get("X-dSpAm-CoNfIdEnCe")
'0.8475 '

您可以拆分已知字符上的字符串并去除空白

string=“X-DSPAM-Confidence:0.8475”
numberString=string.split(“:”[1]。strip(“”)#'0.8475'
数字=浮动(数字串)#0.8475
打印(数字)

如果文本的格式始终与您给出的示例相同,则执行以下操作会容易得多:

float(str.split(" ")[1])

Ps:将变量命名为已经存在的事物不是一个好主意,因为没有人使用正则表达式得到答案:

import re

s = "X-DSPAM-Confidence: 0.8475 "

ans = float(re.findall('\d+\.\d+', s)[0])
print(ans)

下面是一个与您的尝试更接近的基本解决方案:

y = float(value[value.find(':')+1:])

它只是转换第一个
之后的剩余子字符串,当然,只有当
后面紧跟一个数字,并且周围有可选的空格时,它才起作用。

不要将名称
str
用作变量,因为它会屏蔽内置类型。float(“X-DSPAM-Confidence:0.8475”。strip().split(“”[1])至于您的最后一个问题:
e=value.find(“”,s)
将为您提供位置sWhy split on
后的第一个空格的位置,而
str.split()将为您提供任意宽度分割?如果要丢弃第一个元素和第二个元素以外的任何元素,为什么要拆分两次以上?为什么只在空格上拆分?如果使用了标签怎么办?这在电子邮件标题中完全有效。此外,
float()
不关心前导或尾随空格。不要在不需要的地方做额外的工作。最后,当您只需要一个分区时,不要使用split
str.partition()
更快。
float(str.split(" ")[1])
import re

s = "X-DSPAM-Confidence: 0.8475 "

ans = float(re.findall('\d+\.\d+', s)[0])
print(ans)
y = float(value[value.find(':')+1:])