我如何告诉python从一封类似列表结构的电子邮件中提取最后两个单词,但由于它的变化而不是python定义的列表?

我如何告诉python从一封类似列表结构的电子邮件中提取最后两个单词,但由于它的变化而不是python定义的列表?,python,windows,list,email,Python,Windows,List,Email,代码还有更多内容,但我让它对特定的电子邮件进行排序和阅读(但此电子邮件消息会发生变化,并且更多内容会以一种有序的格式添加到电子邮件消息中,这种格式看起来像一个列表,但不是一个可以标记的物理列表..) 当它打印时,它会打印: Run script8.py Run task9.py Play asdf.mp3 Run unpause.py 但它会发生变化,所以如果我在十分钟后运行它,它可能会说: Run script8.py Run task9.py Play asdf.mp3

代码还有更多内容,但我让它对特定的电子邮件进行排序和阅读(但此电子邮件消息会发生变化,并且更多内容会以一种有序的格式添加到电子邮件消息中,这种格式看起来像一个列表,但不是一个可以标记的物理列表..)

当它打印时,它会打印:

Run script8.py


Run task9.py


Play asdf.mp3


Run unpause.py
但它会发生变化,所以如果我在十分钟后运行它,它可能会说:

Run script8.py


Run task9.py


Play asdf.mp3


Run unpause.py


Run newscript88.py
我需要它从上面的代码中提取打印出来的内容,并提取最后两个单词,在本例中是
运行newscript88.py
,然后将其标记为字符串,以便以后像这样放入代码中:

os.startfile('Run newscript88.py')
lastLine = body.split('\n')[-1]
lastTwoWords = lastLine.split(None, 1)
因此,从字面上看,它会从电子邮件中提取最后两个词,然后将最后两个词放入以下内容:

    os.startfile('last 2 words')

您想要正文中的最后两个单词,它作为字符串存在于变量
body
中,对吗

确切答案取决于你如何定义“单词”,但这里有一个非常简单的答案:

lastTwoWords = body.split()[-2:]
如果您打印它,您将得到类似于
['Run','newscript88.py']
的内容。要将其放回字符串中,只需使用
join

os.startfile(' '.join(lastTwoWords))
从您的示例数据来看,似乎至少最后一个“单词”可能包含空格,而您真正想要的是最后一行的两个单词……因此,您可能想要这样的内容:

os.startfile('Run newscript88.py')
lastLine = body.split('\n')[-1]
lastTwoWords = lastLine.split(None, 1)

您想要正文中的最后两个单词,它作为字符串存在于变量
body
中,对吗

确切答案取决于你如何定义“单词”,但这里有一个非常简单的答案:

lastTwoWords = body.split()[-2:]
如果您打印它,您将得到类似于
['Run','newscript88.py']
的内容。要将其放回字符串中,只需使用
join

os.startfile(' '.join(lastTwoWords))
从您的示例数据来看,似乎至少最后一个“单词”可能包含空格,而您真正想要的是最后一行的两个单词……因此,您可能想要这样的内容:

os.startfile('Run newscript88.py')
lastLine = body.split('\n')[-1]
lastTwoWords = lastLine.split(None, 1)

尝试以下几点:

import re
pat = re.compile('\w+ \w+[.]*$') # not very good regex
here_text = r'''here is some text
with lots of words, of which I only
want the LJ;lkdja9948 last two'''
i = pat.search(here_text)
i.group()
>> 'last two'

尝试以下几点:

import re
pat = re.compile('\w+ \w+[.]*$') # not very good regex
here_text = r'''here is some text
with lots of words, of which I only
want the LJ;lkdja9948 last two'''
i = pat.search(here_text)
i.group()
>> 'last two'

由于您不在*NIX系统上,我不能建议
tee
ing脚本和
tail
ing文件

但是,我建议在您的程序中使用只包含两项的缓冲区:

class Buffer:
    def __init__(self):
        self.items = []
    def add(self, item):
        self.items.append(item)
        self.items = self.items[-2:]
    def __str__(self):
        return "[%s, %s]" %(self.items[0], self.items[1])
    def __getitem__(self, i):
        return self.items[i]
在您的代码中使用此缓冲区,并在打印值之前添加到其中。然后,在任何时候,缓冲区中的值都将是“最后两个值”


希望这有帮助

因为你不是在*NIX系统上,我不能建议
tee
ing你的脚本和
tail
ing文件

但是,我建议在您的程序中使用只包含两项的缓冲区:

class Buffer:
    def __init__(self):
        self.items = []
    def add(self, item):
        self.items.append(item)
        self.items = self.items[-2:]
    def __str__(self):
        return "[%s, %s]" %(self.items[0], self.items[1])
    def __getitem__(self, i):
        return self.items[i]
在您的代码中使用此缓冲区,并在打印值之前添加到其中。然后,在任何时候,缓冲区中的值都将是“最后两个值”


希望这能有所帮助

您几天前问过类似的问题吗?是的,它偏离了主题,我的问题措辞拙劣,没有解决方案,因此我正在努力更好地解释它。我不确定这是否重要,因为我试图重新问一个完全不同的问题。你是否试图找到一种方法,在不改变程序本身的情况下阅读程序打印到屏幕上的最后两行内容?几天前你问过类似的问题吗?是的,它偏离了主题,我的问题措辞糟糕,没有回答所以我试图更好地解释它。我不确定这是否重要,因为我试图重新问一个完全不同的问题。你是否试图找到一种方法,在不改变程序本身的情况下读取程序打印到屏幕上的最后两行?对于“获取最后两个单词”的情况,regexp几乎肯定是过火了…对于“获取最后两个单词”的情况,regexp几乎肯定是过火了…