[英]Parsing a string pattern (Python)
我有一個包含以下數據的文件:
<<row>>12|xyz|abc|2.34<</row>>
<<eof>>
該文件可能有幾行這樣。 我正在嘗試設計一個解析器,它將解析此文件中存在的每一行並返回一個包含所有行的數組。 最好的方法是什么? 代碼必須用python編寫。 代碼不應采用不以<<row>>
開頭或應引發錯誤的行。
========> 更新 <========
我剛剛發現一個特定的<<row>>
可以跨越多行。 所以我的代碼和下面的代碼不再工作了。 有人可以建議一個有效的解決方案嗎?
數據文件可以包含數百到數千行。
def parseFile(fileName):
with open(fileName) as f:
def parseLine(line):
m = re.match(r'<<row>>(\d+)\|(\w+)\|(\w+)\|([\d\.]+)<</row>>$', line)
if m:
return m.groups()
return [ values for values in (
parseLine(line)
for line in f
if line.startswith('<<row>>')) if values ]
和? 我不一樣嗎? ;-)
沒有正則表達式的簡單方法:
output = []
with open('input.txt', 'r') as f:
for line in f:
if line == '<<eof>>':
break
elif not line.startswith('<<row>>'):
continue
else:
output.append(line.strip()[7:-8].split('|'))
這使用以<<row>>
開頭的每一行,直到一行只包含<<eof>>
一個好的做法是測試不需要的情況並忽略它們。 一旦您確定您有一條合規的生產線,您就可以對其進行處理。 請注意,實際處理不在 if 語句中。 如果行不分成多行,您只需要兩個測試:
rows = list()
with open('newfile.txt') as file:
for line in file.readlines():
line = line.strip()
if not line.startswith('<<row>>'):
continue
if not line[-8:] == '<</row>>':
continue
row = line[7:-8]
rows.append(row)
將行拆分為多行,在某些情況下您需要保存前一行:
rows = list()
prev = None
with open('newfile.txt') as file:
for line in file.readlines():
line = line.strip()
if not line.startswith('<<row>>') and prev is not None:
line = prev + line
if not line.startswith('<<row>>'):
continue
if not line[-8:] == '<</row>>':
prev = line
continue
row = line[7:-8]
rows.append(row)
prev = None
如果需要,您可以使用以下方法拆分列: cols = row.split('|')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.