我有以下格式的文本:
>>name of section a keyword
#a
some text
some text
some text
>>END_SECTION
>>name section b keyword
#a
some text
some text
some text
>>END_SECTION
continues...
“關鍵字”可以是通過、失敗或警告。
我想撰寫一個可以得到以下輸出的代碼:
name of section keyword
問題是我對 python 非常陌生,并且不知道如何從文本檔案中提取字串,當結束標記(關鍵字)可以在三個不同單詞之間變化時。
我嘗試使用 # 符號作為字串的結束標記,但它不起作用。我試過的代碼是:
class get_word(object):
def get_sentences(self, name_section):
with open(filename) as file_content:
file_content.read().splitlines()
for line in file_content:
if name_section in line:
start_line = file_content.index(line)
end_line = file_content[start_line:].index('#')
data = file_content[start_line:start_line end_line]
return data
我已將代碼匯入不同的腳本并撰寫了以下代碼:
import get_word
for data in f.get_sentences('name_section_a'):
print(data)
但給出以下錯誤:
ValueError: False is not in list
有一個更好的方法嗎?例如,可以使用 re.match() 嗎?
任何幫助將不勝感激!
uj5u.com熱心網友回復:
我不明白你在用搜索#. 它與回傳name of section keyword線路無關。
class get_word(object):
def get_sentences(self, name_section):
prefix = ">>" name_section
with open(filename) as file_content:
for line in file_content:
if line.startswith(prefix):
return line.strip()
這不回傳串列,它只回傳一行,因此呼叫者不需要回圈。
uj5u.com熱心網友回復:
您期望的確切輸出尚不清楚,但您可以使用正則運算式來提取欄位:
import re
re.findall('(?<=^>>)(?!END_SECTION)(.*)', text, re.M)
輸出:
['name of section a keyword', 'name section b keyword']
如果要分隔關鍵字并洗掉數字:
re.findall('(?<=^>>)(?!END_SECTION)(.*)\s \w \s (\w )', t, re.M)
輸出:
[('name of section', 'keyword'), ('name section', 'keyword')]
輸入:
text = '''>>name of section a keyword
#a
some text
some text
some text
>>END_SECTION
>>name section b keyword
#a
some text
some text
some text
>>END_SECTION'''
uj5u.com熱心網友回復:
如果你想為此使用正則運算式,它當然應該是可能的,盡管你需要使用諸如負前瞻之類的東西?!來跳過諸如此類的行>>END_SECTION。
以下正則運算式應捕獲部分開始行中的部分名稱和關鍵字:
^>>(?!END_SECTION)(.*)[ ]{5}(. )$
您也可以在Regex Demo上嘗試一下。請注意,第一個捕獲的組是部分名稱,第二個是行尾匹配的關鍵字。
如果需要,這里有一個可用于測驗的 Python 示例。請注意,我正在使用StringIOwhich 代表一個類似檔案的物件。
import re
from io import StringIO
file_contents = StringIO("""
>>name of section a keyword
#a
some text
some text
some text
>>END_SECTION
>>name section b keyword
#a
some text
some text
some text
>>END_SECTION
continues...
""")
string = file_contents.read()
pattern = re.compile(r'^>>(?!END_SECTION)(.*)[ ]{5}(. )$', flags=re.MULTILINE)
section_names = pattern.finditer(string)
for section in section_names:
# section is a Match object, we can access attributes like the matched
# groups from the object.
print(section.groups())
輸出:
('name of section a', 'keyword')
('name section b', 'keyword')
如果您使用非正則運算式解決方案,以下方法也應該有效:
string = file_contents.read()
lines = string.strip().split('\n')
# separator between section name and keyword
sep = ' '
section_lines = [line.lstrip('>').split(sep, 1) for line in lines
if line.startswith('>>') and line[2:5] != 'END']
print(section_lines)
印刷:
[['name of section a', 'keyword'], ['name section b', 'keyword']]
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/341440.html
下一篇:字串操作熊貓
