感謝編輯與示例代碼的問題。這是一個解決方案,當在一行中遇到'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