Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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_Regex_Xlwt - Fatal编程技术网

Python解析-一个文本文件中包含多封电子邮件

Python解析-一个文本文件中包含多封电子邮件,python,regex,xlwt,Python,Regex,Xlwt,我收到来自多个发件人的类似电子邮件,并使用下面的正则表达式m和n提取所需字符串。那部分很好用 然而,正则表达式o却让我感到困惑。我正在阅读的文本文件是9封电子邮件的组合,保存到一个文本文件中,并以字符串形式在Python中打开。原始发件人(regexo)出现在文件中每个新邮件的开头(9次) 我想在找到的每个CUSIP和名称之后写相同的原始发件人,直到匹配不同的原始发件人 我使用的是xlwt3和wincom32 来自文本文件的示例,包含非常标准的组合电子邮件: --- Original Sende

我收到来自多个发件人的类似电子邮件,并使用下面的正则表达式
m
n
提取所需字符串。那部分很好用

然而,正则表达式
o
却让我感到困惑。我正在阅读的文本文件是9封电子邮件的组合,保存到一个文本文件中,并以字符串形式在Python中打开。原始发件人(regex
o
)出现在文件中每个新邮件的开头(9次)

我想在找到的每个CUSIP和名称之后写相同的原始发件人,直到匹配不同的原始发件人

我使用的是xlwt3和wincom32

来自文本文件的示例,包含非常标准的组合电子邮件:

--- Original Sender: TOM MADEUPNAME, SOME BANK, N. ---
----- Original Message -----
From: TOM MADEUPNAME (SOME BANK, N.)
To: BOB THISISMYEMAIL (XYZ INVESTMENTS, INC)
At:  8/31  8:53:25
**Offerings**

Mezz ReRemics
Cusip      Description       Original Current Cashflow Collat Offering
05531UAB6  BCAP 2009-RR5 1A2   18,745  18,745 Snr Sup  Fxd      45.000

Prime/Alt-A Fixed
Cusip      Description       Original Current Cashflow Collat Offering
059487AE8  BOAA 2006-6 CB5     25,940  14,350 Seq      Fxd      83.000
12544XAX3  CWHL 2007-9 A13     10,190  10,190 Ssnr Nas Fxd      92.500
17312XAJ3  CMSI 2007-4 1A9      2,871   2,741 Spr Snr  Fxd      86.000

--- Original Sender: JOE MADEUPNAME, EUROPEAN BANK SECURI ---
----- Original Message -----
From: JOE MADEUPNAME (EUROPEAN BANK SECURI)
To: BOB THISISMYEMAIL (XYZ INVESTMENTS, INC)
At:  8/31  8:20:16

8-31-2011 

Alt-A Fixed
Bond            O/F    C/F    Cpn  FICO CAL WALB  60+    Notes             Offer
CSMC 06-9 7A1   25.00  11.97  L+45  728  26  578  35.21  FLT,AS,0.0%       50-00
LXS 07-10H 2A1  68.26  34.01  L+16  744   6  125  33.98  SS,9.57%          42-00
CSMC 06-7 9A1   15.00   7.81  L+30  688   5  198  46.46  SS,0.0%           29-16

Prime Hybrid 
Bond            O/F     C/F   Cpn  FICO CAL WALB  60+    Notes             Offer
SARM 05-18 6A1  14.56   6.01  2.58  730  46  432  15.87  SEA,SS,5/1,12.3%  78-00

Alt-A Hybrid
Bond            O/F    C/F    Cpn  FICO CAL WALB  60+    Notes             Offer
ARMT 05-12 2A1  23.78  10.71  3.07  712  48  556  35.32  SS,5/1,4.9%       *SOLD

Option Arm
Bond                O/F    C/F   Cpn  FICO CAL WALB  60+    Notes          Offer
DBALT 07-OA4 1A1B  10.00   7.25  L+13  716  63  562  47.17  SS,OC,42.2%    64-16
--------------------------------------------------------------------------------------
更新-工作 根据需要更新输出。
您的问题并不完全清楚,因为您没有显示输出示例,但这里有一个有根据的猜测:

count_cusip = 0
count_name = 0
count_sender = 0 
cur_sender = ''
for line in lines:

    m = re.search('[0-9]{3}[a-zA-Z0-9]{6}', line)
    if m:
        count_cusip += 1
        ws.write(count_cusip,0,m.group(0))
        ws.write(count_cusip,2,cur_sender)

    n = re.search('[A-Z]{3,5}\s[0-9]{1,4}\D{1,3}\S{1,3}\s{1,2}\w+', line)
    if n:
        count_name += 1
        ws.write(count_name,1,n.group(0))
        ws.write(count_name,2,cur_sender)

    o = re.search(r"Original Sender:\s\b\w+\s\w+", line)
    if o:
        count_sender += 1
        cur_sender = o.group(0)

遇到原始发件人时,您需要保存它并为每个cusip和名称写入当前值,而不是写入原始发件人。

您可以将格式更改为标准库中模块可以识别的格式。然后您可以让该模块处理所有解析。

什么是ws.write()?你是在用
xlwt
写电子表格吗?如果你能给出一个你试图处理的输入的例子,那会有很大帮助。您应该更改电子邮件的名称、主题行和内容以保护隐私,但保留常规格式不变,以便我们可以看到您试图解析的内容。在您的上一个正则表达式中,
\b
的目的是什么?在我看来,您正在查找冒号后面正好有一个空格字符,后面必须至少有一个字母数字。根据定义,我认为这是一个词的边界。我发布了输出以提供帮助。此代码似乎产生了覆盖错误。回溯(最后一次调用):ws.write(count\u sender,5,cur\u sender)文件“C:\Python31\lib\site packages\xlwt3\sheet.py”,第961行,在write self.row(r)中。write(C,label,style)文件“C:\Python31\lib\site packages\xlwt3\row.py”,第226行,在write StrCell(self.\uu idx,col,style\u index,self.\uu parent\uu wb.add(label))文件中“C:\Python31\lib\site packages\xlwt3\row.py”,插入单元格引发异常(msg)中的第145行异常:尝试覆盖单元格:sheetname='Bond List'rowx=1 colx=5在不知道ws.write的功能和运行的上下文的情况下,无法确定需要执行的操作。显示的输出明显不反映ws.write正在执行的操作。ws.write来自xlwt并以excel.ws.write的格式写入单元格(行、列、正则表达式匹配)。for循环逐行读取文本文件,正则表达式m的第一次传递匹配字符串中的cusip,并通过ws.write(1,0,'929766LY7')将其写入excel,以及正则表达式n匹配bond_名称,并通过ws.write(1,1,'WBMCMT 2003-C8 A4')将其放入excel.我在帮你吗?@dadashek:好的,我更新了代码,将当前原始发件人放在第3列的每一行。你的示例仍然没有意义:为什么原始发件人以FAIRF开头是空的?
CUSIP   Bond Name           Original Sender
00442PAD2   ACE 2006-OP1 A2B        Original Sender: Nick Madeupname
12557YAE7   ARMT 05-12 2A1          Original Sender: Bobby Madeupname
39153VAT1   CSMC 06-9 7A1           Original Sender: Bobby Madeupname
05377RAE4   LXS 07-10H 2A1          Original Sender: Jane Madeupname
02005HAF0   CSMC 06-7 9A1           Original Sender: Jane Madeupname
count_cusip = 0
count_name = 0
count_sender = 0 
cur_sender = ''
for line in lines:

    m = re.search('[0-9]{3}[a-zA-Z0-9]{6}', line)
    if m:
        count_cusip += 1
        ws.write(count_cusip,0,m.group(0))
        ws.write(count_cusip,2,cur_sender)

    n = re.search('[A-Z]{3,5}\s[0-9]{1,4}\D{1,3}\S{1,3}\s{1,2}\w+', line)
    if n:
        count_name += 1
        ws.write(count_name,1,n.group(0))
        ws.write(count_name,2,cur_sender)

    o = re.search(r"Original Sender:\s\b\w+\s\w+", line)
    if o:
        count_sender += 1
        cur_sender = o.group(0)