python:如何从一个自然语言文件中提取记录-从记录的开头开始的分隔符是5个字符

python:如何从一个自然语言文件中提取记录-从记录的开头开始的分隔符是5个字符,python,parsing,text,Python,Parsing,Text,我需要从一个相当古老的系统生成的日志文件中提取单个记录,并为数据库输入做好准备。我只能提取这些平面文件(仅格式化查询就花了数周时间)。下面是一个包含两条记录的文件示例。我看到的唯一分隔符是“/11 S11-”,它本身位于5个字符的常规位置,但不完全在开头或结尾 对于那些观看的人来说,是的,这是与。我已经看过python文档,一些google结果,还有一些。所以,我的问题是 a) 如何使用在记录中以5个字符开头的分隔符 b) 如何抓住这些大块的自然语言 c) 如何去掉换行后的空格?这可能是最简单的

我需要从一个相当古老的系统生成的日志文件中提取单个记录,并为数据库输入做好准备。我只能提取这些平面文件(仅格式化查询就花了数周时间)。下面是一个包含两条记录的文件示例。我看到的唯一分隔符是“/11 S11-”,它本身位于5个字符的常规位置,但不完全在开头或结尾

对于那些观看的人来说,是的,这是与。我已经看过python文档,一些google结果,还有一些。所以,我的问题是

a) 如何使用在记录中以5个字符开头的分隔符

b) 如何抓住这些大块的自然语言

c) 如何去掉换行后的空格?这可能是最简单的部分:我可以在查询中指定每个字段的长度。现在,accessionDate是10个字符长,accessionNumber是10个字符长,PatMedicalRecordum是15个字符长。因此finalDxText上的空白是35个字符

01/01/11  S11-55555 20/444-55-6666 A.  PROSTATE AND SEMINAL VESICLES, PROSTATECTOMY:                           
                                   -  ADENOCARCINOMA.                                                      

                                   TOTAL GLEASON SCORE:  GLEASON 5+4=9                                     
                                   TUMOR LOCATION:  BILATERAL                                              
                                   TUMOR QUANTITATION:  15% OF PROSTATE INVOLVED BY TUMOR
                                   EXTRAPROSTATIC EXTENSION:  PRESENT AT RIGHT POSTERIOR                   
                                   SEMINAL VESICLE INVASION:  PRESENT                                      
                                   MARGINS:  UNINVOLVED                                                    
                                   LYMPHOVASCULAR INVASION:  PRESENT                                       
                                   PERINEURAL INVASION:  PRESENT                                           
                                   LYMPH NODES (SPECIMENS B AND C):                                        
                                      NUMBER EXAMINED:  25                                                 
                                      NUMBER INVOLVED:  1                                                  
                                      DIAMETER OF LARGEST METASTASIS:  1.7 mm                              
                                   ADDITIONAL FINDINGS:  HIGH-GRADE PROSTATIC INTRAEPITHELIAL NEOPLASIA,   
                                      ACUTE AND CHRONIC INFLAMMATION, INTRADUCTAL EXTENSION OF INVASIVE    
                                      CARCINOMA                                                            

                                   PATHOLOGIC STAGE:  pT3b N1 MX                                           

                               B.  LYMPH NODES, RIGHT PELVIC, EXCISION:                                    
                                   -  ONE OF SEVENTEEN LYMPH NODES POSITIVE FOR METASTASIS (1/17).         

                               C.  LYMPH NODES, LEFT PELVIC, EXCISION:                                     
                                   -  EIGHT LYMPH NODES NEGATIVE FOR METASTASIS (0/8).                     
01/02/11  S11-4444 20/111-22-3333 PROSTATE AND SEMINAL VESICLES, PROSTATECTOMY:                               
                                  - ADENOCARCINOMA.                                                        
                                    GLEASON SCORE:  3 + 3 = 6 WITH TERTIARY PATTERN OF 5.                                             
                                    TUMOR QUANTITATION:  APPROXIMATELY 10% BY VOLUME.                      
                                    TUMOR LOCATION:  BILATERAL.                                            
                                    EXTRAPROSTATIC EXTENSION:  NOT IDENTIFIED.                             
                                    MARGINS:  NEGATIVE.                                                    
                                    PERINEURAL INVASION:  IDENTIFIED.                                      
                                    LYMPH-VASCULAR INVASION:  NOT IDENTIFIED.                              
                                    SEMINAL VESICLE/VASA DEFERENTIA INVASION: NOT IDENTIFIED.              
                                    LYMPH NODES:  NONE SUBMITTED.                                          
                                    OTHER:  HIGH GRADE PROSTATIC INTRAEPITHELIAL NEOPLASIA.                
                                   PATHOLOGIC STAGE (pTNM):  pT2c NX. 
分隔符 我可能已经脱钩了,但看看你的记录,特别是查看
01/01/11 S11-55555 20/444-55-6666
01/01/11
对我来说似乎是个约会

因此,从您的输入来看:

  • 您可以使用非常简单的正则表达式和
    re.match
    检查行是否以日期开头(我想这里的格式是
    mm/dd/yy
  • 看起来每个记录中的数据都缩进了,所以看起来一行没有缩进意味着它是一个分隔符
空白
my_string.strip
返回
my_string
去除首字母和尾随空格。

分隔符 我可能已经脱钩了,但看看你的记录,特别是查看
01/01/11 S11-55555 20/444-55-6666
01/01/11
对我来说似乎是个约会

因此,从您的输入来看:

  • 您可以使用非常简单的正则表达式和
    re.match
    检查行是否以日期开头(我想这里的格式是
    mm/dd/yy
  • 看起来每个记录中的数据都缩进了,所以看起来一行没有缩进意味着它是一个分隔符
空白
my_string.strip
返回
my_string
去除首字母和尾随空格。

我会尝试以下方法:

import re                                # regex module

in_string = """Text from above"""

records = []                             # list to store all records in order
record = ""                              # string to store current record

for line in in_string.splitlines():      # go through each line of the input
    if re.match('\d\d/\d\d/\d\d',line):  # match the date at the start 
        records.append(record)           # add current record to list
        record = ""                      # start new current record
    record += line.strip()               # add line (without whitespace) to current record
records.append(record)                   # add last record to records list
这将产生以下结果:

[''

'01/01/11 S11-55555 20/444-55-6666 A.前列腺和精囊,前列腺切除术:-腺癌。GLEASON总分:GLEASON 5+4=9肿瘤位置:双侧肿瘤定量:15%的前列腺受肿瘤侵袭前列腺延伸:存在于右后精囊浸润:存在边缘:未受累淋巴血管浸润ON:当前神经周围浸润:当前淋巴结(标本B和C):检查次数:25涉及人数:1最大转移直径:1.7 M其他发现:高度前列腺上皮内瘤变,急性和慢性炎症,浸润性癌导管内扩张病理阶段:pT3b N1 MXB。淋巴结,右盆腔,切除:-17个淋巴结中有一个淋巴结转移阳性(1/17).C.淋巴结,左骨盆,切除:-8个淋巴结转移阴性(0/8)。”

'01/02/11 S11-4444 20/111-22-3333前列腺和精囊,前列腺切除术:-腺癌。GLEASON评分:3+3=6,三级模式为5。肿瘤定量:体积约10%。肿瘤位置:双侧。前列腺外延伸:未确定。边缘:阴性。神经周围浸润:确定。淋巴-血管浸润:未确定。精囊/输精管侵犯:未确定。淋巴结:未提交。其他:高度前列腺上皮内瘤变。病理分期(pTNM):pT2c NX。“]

注意:这是一个蹩脚的正则表达式,将匹配任何以“nn/nn/nn”开头的行

您可能需要在行之间添加一个空格,例如
record+=line.strip()++'

祝你好运



您可以随意使用正则表达式(regex/re)-将正则表达式(即
\d\d/\d\d/\d\d S11
)放在顶部框中,将文本放在底部框中。

我会尝试以下方法:

import re                                # regex module

in_string = """Text from above"""

records = []                             # list to store all records in order
record = ""                              # string to store current record

for line in in_string.splitlines():      # go through each line of the input
    if re.match('\d\d/\d\d/\d\d',line):  # match the date at the start 
        records.append(record)           # add current record to list
        record = ""                      # start new current record
    record += line.strip()               # add line (without whitespace) to current record
records.append(record)                   # add last record to records list
这将产生以下结果:

[''

'01/01/11 S11-55555 20/444-55-6666 A.前列腺和精囊,前列腺切除术:-腺癌。GLEASON总分:GLEASON 5+4=9肿瘤位置:双侧肿瘤定量:15%的前列腺受肿瘤侵袭前列腺延伸:存在于右后精囊浸润:存在边缘:未受累淋巴血管浸润ON:当前神经周围浸润:当前淋巴结(标本B和C):检查次数:25涉及人数:1最大转移直径:1.7 M其他发现:高度前列腺上皮内瘤变,急性和慢性炎症,浸润性癌导管内扩张病理阶段:pT3b N1 MXB。淋巴结,右盆腔,切除:-17个淋巴结中有一个淋巴结转移阳性(1/17).C.淋巴结,左骨盆,切除:-8个淋巴结转移阴性(0/8)。”

'01/02/11 S11-4444 20/111-22-3333前列腺和精囊,前列腺切除术:-腺癌。GLEASON评分:3+3=6,三级模式为5。肿瘤定量:体积约10%。肿瘤位置:双侧。前列腺外延伸:未确定。边缘:阴性。神经周围浸润:确定。淋巴-血管浸润:未确定。精囊/输精管侵犯:未确定。淋巴结:未提交。其他:高度前列腺上皮内瘤变。病理分期(pTNM):pT2c NX。“]

注意:这是一个蹩脚的正则表达式,将匹配