Python-spilt()覆盖多个空间

Python-spilt()覆盖多个空间,python,split,Python,Split,我按照这个答案的()方向找到了一个T,但它一直失败,所以我想知道是我缺少了一些简单的东西,还是我需要一个新的方法来解决这个问题 我有以下.eml文件: 我的目标是最终解析出所有鱼类种群及其相应的重量,但对于测试,我只使用以下代码: with open(file_path) as f: for line in f: if ("Haddock" in line): #fish, remainder = re.split(" +", line)

我按照这个答案的()方向找到了一个T,但它一直失败,所以我想知道是我缺少了一些简单的东西,还是我需要一个新的方法来解决这个问题

我有以下.eml文件:

我的目标是最终解析出所有鱼类种群及其相应的重量,但对于测试,我只使用以下代码:

with open(file_path) as f:
    for line in f:
        if ("Haddock" in line):
            #fish, remainder = re.split(" +", line)
            fish, remainder = line.split()
            print(line.lower().strip())
            print("fish:", fish)
            print("remainder:", remainder)
它在第
fish行失败,余数=line.split()
错误

ValueError:要解包的值太多(预期为2个)

这告诉我Python失败是因为它试图在太多的空间上拆分,对吗?还是我误解了?我想从这个过程中得到两个值:鱼的名称(包含许多空格前的所有文本的字符串)和数量(输入行右侧的整数)


任何帮助都将不胜感激

您可以使用下面的正则表达式进行拆分

fish, remainder = re.split(r'(?<=\w)\s+(?=\d)',line.strip())

it will split and give `['GB Haddock West', '22572']`

fish,rements=re.split(r')(?您可以使用下面的正则表达式进行拆分

fish, remainder = re.split(r'(?<=\w)\s+(?=\d)',line.strip())

it will split and give `['GB Haddock West', '22572']`
fish,余数=re.split(r'(?)?
我希望
GB Haddock West
,剩余的
22572

你可以这样做:

s = line.split()
fish, remainder = " ".join(s[:-1]), s[-1]
您可以使用
rindex()
找到最后一个空格并在其中拆分,而不是使用
split()

at = line.rindex(" ")
fish, remainder = line[:at], line[at+1:]
两者都将输出:

print(fish) # GB Haddock West  
print(remainder) # 22572
我希望
GB Haddock West
,剩余的
22572

你可以这样做:

s = line.split()
fish, remainder = " ".join(s[:-1]), s[-1]
您可以使用
rindex()
找到最后一个空格并在其中拆分,而不是使用
split()

at = line.rindex(" ")
fish, remainder = line[:at], line[at+1:]
两者都将输出:

print(fish) # GB Haddock West  
print(remainder) # 22572

是的,你可以在多个空间上分割。但是,除非你能指定空格数,否则你会在中间得到额外的空字段,就像你现在得到的。例如:

in_stuff = [
    "GB Haddock West          22572",
    "GB Cod West               7207",
    "GB Haddock East           3776"
]

for line in in_stuff:
    print line.split("   ")
输出:

['GB Haddock West', '', '', ' 22572']
['GB Cod West', '', '', '', '', '7207']
['GB Haddock East', '', '', '  3776']
GB Haddock West 22572
GB Cod West 7207
GB Haddock East 3776
但是,一个简单的更改将得到您想要的:从以下字段中选择第一个和最后一个字段:

for line in in_stuff:
    fields = line.split("   ")
    print fields[0], int(fields[-1])
输出:

['GB Haddock West', '', '', ' 22572']
['GB Cod West', '', '', '', '', '7207']
['GB Haddock East', '', '', '  3776']
GB Haddock West 22572
GB Cod West 7207
GB Haddock East 3776

这会解决你的问题吗?

是的…你可以在多个空间上分割。但是,除非你能指定空格数,否则你会在中间得到额外的空字段,就像你现在得到的。例如:

in_stuff = [
    "GB Haddock West          22572",
    "GB Cod West               7207",
    "GB Haddock East           3776"
]

for line in in_stuff:
    print line.split("   ")
输出:

['GB Haddock West', '', '', ' 22572']
['GB Cod West', '', '', '', '', '7207']
['GB Haddock East', '', '', '  3776']
GB Haddock West 22572
GB Cod West 7207
GB Haddock East 3776
但是,一个简单的更改将得到您想要的:从以下字段中选择第一个和最后一个字段:

for line in in_stuff:
    fields = line.split("   ")
    print fields[0], int(fields[-1])
输出:

['GB Haddock West', '', '', ' 22572']
['GB Cod West', '', '', '', '', '7207']
['GB Haddock East', '', '', '  3776']
GB Haddock West 22572
GB Cod West 7207
GB Haddock East 3776

这能解决您的问题吗?

基于@Vallentin的答案,但使用Python 3的扩展解包功能:

In [8]: line = "GB Haddock West 22572"

In [9]: *fish, remainder = line.split()

In [10]: print(" ".join(fish))
GB Haddock West

In [11]: print(int(remainder))
22572

基于@Vallentin的答案,但使用Python 3的扩展解包功能:

In [8]: line = "GB Haddock West 22572"

In [9]: *fish, remainder = line.split()

In [10]: print(" ".join(fish))
GB Haddock West

In [11]: print(int(remainder))
22572

你是对的。
line.split()
会产生
['GB'、'Haddock'、'West'、'22572']
,当然不能将其分解为两个名称。哦,好的。那么有没有办法直接回答链接用户的问题呢?我可以
split()吗
特别是在一行中的几个空格上?你能举例说明一下
鱼和
余数是什么吗?对,我不是很清楚。在过去的案例(电子邮件)中,他们通常会列出鱼、重量和价格;所以第一个
拆分()
将产生一条
鱼和一条
余数
,然后我将
split()
余数
产生一个重量和价格。在这种情况下,我希望
GB Haddock West
余数
22572
。你是对的。
line.split()
结果是
['GB'、'Haddock'、'West'、'22572']
当然不能将其分解为两个名称。哦,好的。那么有没有办法直接回答链接用户的问题?我可以
拆分()
特别是在一行中的几个空格上?你能举例说明一下
鱼和
余数是什么吗?对,我不是很清楚。在过去的案例(电子邮件)中,他们通常会列出鱼、重量和价格;所以第一个
拆分()
将产生一条
鱼和一条
余数
,然后我将
split()
余数
产生一个重量和价格。在这种情况下,我希望
GB Haddock West
余数
22572