python:如何从一个自然语言文件中提取记录-从记录的开头开始的分隔符是5个字符
我需要从一个相当古老的系统生成的日志文件中提取单个记录,并为数据库输入做好准备。我只能提取这些平面文件(仅格式化查询就花了数周时间)。下面是一个包含两条记录的文件示例。我看到的唯一分隔符是“/11 S11-”,它本身位于5个字符的常规位置,但不完全在开头或结尾 对于那些观看的人来说,是的,这是与。我已经看过python文档,一些google结果,还有一些。所以,我的问题是 a) 如何使用在记录中以5个字符开头的分隔符 b) 如何抓住这些大块的自然语言 c) 如何去掉换行后的空格?这可能是最简单的部分:我可以在查询中指定每个字段的长度。现在,accessionDate是10个字符长,accessionNumber是10个字符长,PatMedicalRecordum是15个字符长。因此finalDxText上的空白是35个字符python:如何从一个自然语言文件中提取记录-从记录的开头开始的分隔符是5个字符,python,parsing,text,Python,Parsing,Text,我需要从一个相当古老的系统生成的日志文件中提取单个记录,并为数据库输入做好准备。我只能提取这些平面文件(仅格式化查询就花了数周时间)。下面是一个包含两条记录的文件示例。我看到的唯一分隔符是“/11 S11-”,它本身位于5个字符的常规位置,但不完全在开头或结尾 对于那些观看的人来说,是的,这是与。我已经看过python文档,一些google结果,还有一些。所以,我的问题是 a) 如何使用在记录中以5个字符开头的分隔符 b) 如何抓住这些大块的自然语言 c) 如何去掉换行后的空格?这可能是最简单的
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。“]
注意:这是一个蹩脚的正则表达式,将匹配