<p><strong>初步了解</p>
<p>根据你的例子,我认为:</p>
<ul>
<li>文本以<strong>行提供。</strong></li>
<li>示例文本似乎有太多的换行符,可能是它从DOS/Windows迁移的产物?如果是这样,则需要CRLF处理,或者应忽略备用行。你知道吗</li>
<li><em>线</em>分为<strong>部分。</strong></li>
<li>每个<em>节</em>在<em>节</em>的第一行<em>的第0,1列中由一个两个字母的大写标记<strong>分隔,并一直持续到新的<em>节</em>的开始。你知道吗</li>
<li>每个<em>行</em>在第0-2列中有一个<em>标记</em>或两个空格,后跟一个空格。你知道吗</li>
<li>由<em>标记</em><code>ER</code>分隔的人工<em>部分</em>标记记录的<em>结束</em>。你知道吗</li>
<li><code>ER</code><em>部分</em>不包含可用的文本。你知道吗</li>
</ul>
<p>也可能出现以下情况:</p>
<ul>
<li>记录由<code>FN</code>标记开始。你知道吗</li>
<li>在<code>FN / ER</code>对之外遇到的任何文本都可以忽略。你知道吗</li>
</ul>
<p><strong>建议设计</strong></p>
<p>如果这是真的,我建议您使用该逻辑编写一个文本处理器:</p>
<ul>
<li>读台词。你知道吗</li>
<li>处理CR/LF处理;或者跳过替换行;或者“不要担心真正的文本没有这些换行符”?你知道吗</li>
<li>使用状态数未知的状态机,初始状态为<code>ER</code>。你知道吗</li>
<li>特殊规则:忽略处于<code>ER</code>状态的文本,直到遇到<code>FN</code>行。你知道吗</li>
<li>一般规则:当看到一个标记时,结束以前的状态并开始一个以看到的标记命名的新状态。任何累积的文本都会添加到记录中。你知道吗</li>
<li>如果看不到标记,则在上一个标记中累积文本。你知道吗</li>
<li>特殊规则:当进入<code>ER</code>状态时,将累计记录添加到累计记录列表中。你知道吗</li>
</ul>
<p>在这个过程结束时,您将有一个记录列表,其中包含各种累积的标记。然后可以用各种方式处理标记。你知道吗</p>
<p>像这样:</p>
<pre><code>from warnings import warn
Debug = True
def read_lines_from(file):
"""Read and split lines from file. This is a separate function, instead
of just using file.readlines(), in case extra work is needed like
dos-to-unix conversion inside a unix environment.
"""
with open(file) as f:
text = f.read()
lines = text.split('\n')
return lines
def parse_file(file):
"""Parse file in format given by
https://stackoverflow.com/questions/54520331
"""
lines = read_lines_from(file)
state = 'ER'
records = []
current = None
for line_no, line in enumerate(lines):
tag, rest = line[:2], line[3:]
if Debug:
print(F"State: {state}, Tag: {tag}, Rest: {rest}")
# Skip empty lines
if tag == '':
if Debug:
print(F"Skip empty line at {line_no}")
continue
if tag == ' ':
# Append text, except in ER state.
if state != 'ER':
if Debug:
print(F"Append text to {state}: {rest}")
current[state].append(rest)
continue
# Found a tag. Process it.
if tag == 'ER':
if Debug:
print("Tag 'ER'. Completed record:")
print(current)
records.append(current)
current = None
state = tag
continue
if tag == 'FN':
if state != 'ER':
warn(F"Found 'FN' tag without previous 'ER' at line {line_no}")
if len(current.keys()):
warn(F"Previous record (FN:{current['FN']}) discarded.")
if Debug:
print("Tag 'FN'. Create empty record.")
current = {}
# All tags except ER get this:
if Debug:
print(F"Tag '{tag}'. Create list with rest: {rest}")
current[tag] = [rest]
state = tag
return records
if __name__ == '__main__':
records = parse_file('input.txt')
print('Records =', records)
</code></pre>