簡體   English   中英

解析字符串模式 (Python)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM