感谢编辑与示例代码的问题。这是一个解决方案,当在一行中遇到'BIRT'时设置一个触发器,并且只有在设置时才输出一个'DATE'行。请注意,如果你也只需要在它“日期”线直接继“BIRT”行,你必须修改代码有点;-)
代码:
#! /usr/bin/env python
from __future__ import print_function
d = """
0 @[email protected] INDI
1 NAME Milo /Vettle/
2 GIVN Milo
2 SURN Vettle
2 _MARNM Vettle
1 SEX M
1 BIRT
2 DATE 23 OCT 1930
1 FAMS @[email protected]
0 @[email protected] INDI
1 NAME Rosy /Huleknberg/
2 GIVN Rosy
2 SURN Huleknberg
2 _MARNM Vettle
1 SEX F
1 BIRT
2 DATE 15 SEP 1928
1 DEAT Y
2 DATE 10 MAR 2010
"""
trigger_found = False
token_trigger = 'BIRT'
token_grep = 'DATE'
for line in d.split('\n'):
if token_trigger in line:
trigger_found = True
continue
if trigger_found and token_grep in line:
print(line)
trigger_found = False
测试使用Python v2.7.11运行:
2 DATE 23 OCT 1930
2 DATE 15 SEP 1928
与python v3相同。
注:这也可能是更强大的(考虑您的输入作为olny样品),触发像BIRT
令牌(用空格填充,作为样本中给出的文字看起来像有可能是文本框可能已经“输入”包含“代码”)如下所示:
2 GIVN BIRTE
这是一个有效的给定名称。这不会改变此示例中的输出,但它会意外设置“触发器”。
更新(应答在评论一个问题):
这条线上面的代码片段:
for line in d.split('\n'):
出d
正文块stoerd通过对换行分割创建一个列表。
如果你已经在列表中有foo
行的列表,说是因为从文件或以其他方式阅读,你可以代替写:
for line in foo:
从文件中读取当你经常换行chacter包含在“行”中,因此在for ...循环头文件后经常会看到s_line = line.strip()
短,以便摆脱围绕“该行所需内容”的那个空白空间。 HTH
更新:从OP得到良好的结果。有在回答一个错字,这是写:
if token_trigger and token_grep in line:
而不是正确的:
if trigger_found and token_grep in line:
这样一来,想要的出生日期成功后打印重置触发False
是无用的。
请[编辑]你的问题,包括你试过什么 –
正如@ cricket_007指出,请编辑您的问题,包括你已经尝试了什么,以何种形式,你有这样的数据?名单?文件? –
是否需要其他编辑? – siddpro