2

以下の入力に基づいてリストを作成しようとしていますが、期待どおりの出力が表示されません。誰かが私がどこで間違っているのか提案できますか?

入力:

CR  FA  CL  Title
409452  WLAN    656885  Age out RSSI values from buffer in Beacon miss scenario
415560  WLAN    656886  To Record SMD Event Logging

私は次のような出力が欲しい

[['CR', 'FA', 'CL', 'TITLE'], ['409452', 'WLAN', '656885', 'Age out RSSI values from buffer in Beacon miss scenario'], ['415560', 'WLAN', '656886','To Record SMD Event Logging']]

しかし、私はそれが次のように作成されているのを見ます

[['CR', 'FA', 'CL', 'TITLE'], ['', '409452', 'WLAN', '656885\tAge out RSSI values from buffer in Beacon miss scenario'], ['', '415560', 'WLAN', '656886\tTo Record SMD Event Logging']]

Pythonコード

 for i in info.splitlines():
    index = re.split(r'\W+',i,3)
    CRlist.append(index)
4

3 に答える 3

2

取得する出力は、各行の先頭以外の最初の行に余分な空白がある場合に期待するものとまったく同じです。

これの一般的な理由の1つは、ユニバーサル改行モードを使用せずに、行末が間違っているファイルを解析しようとして、どうしようもなく混乱してしまったことです。

たとえば、これらの2行は、テキストエディタでは同じように見える場合があります。

409452  WLAN    656885  Age out RSSI values from buffer in Beacon miss scenario
\r409452  WLAN    656885  Age out RSSI values from buffer in Beacon miss scenario

しかし、あなたre.splitは彼らと非常に異なることをするでしょう:

['409452', 'WLAN', '656885', 'Age out RSSI values from buffer in Beacon miss scenario']
['', '409452', 'WLAN', '656885\tAge out RSSI values from buffer in Beacon miss scenario']

解決策は、余分な空白を取り除くことです。より複雑な正規表現を書いてみるか、または単に行うことができますre.split(r'\W+', s.lstrip(), 3)

末尾の空白も削除したいとおっしゃっていたので、:stripの代わりに使用してlstripくださいre.split(r'\W+', s.strip(), 3)

しかし、そもそもなぜ正規表現を使用しているのかわかりませんs.strip().split(None, 3)

于 2012-11-08T02:33:26.693 に答える
1

私はあなたがむしろモジュールを使うべきだと感じていcsvます、しかしここに非正規表現の解決策があります:

>>> s = '''CR  FA  CL  Title
... 409452  WLAN    656885  Age out RSSI values from buffer in Beacon miss scenario
... 415560  WLAN    656886  To Record SMD Event Logging'''
>>> [x.strip().split(None, 3) for x in s.splitlines()]
[['CR', 'FA', 'CL', 'Title'], ['409452', 'WLAN', '656885', 'Age out RSSI values from buffer in Beacon miss scenario'], ['415560', 'WLAN', '656886', 'To Record SMD Event Logging']]
于 2012-11-08T02:34:06.997 に答える
0

これを使用できるよりも区切り文字として\tがある場合(stripを使用して、item.strip()が空のエントリであるかどうかを確認し、空のエントリであるかどうかを確認し、空のエントリである場合はスキップできることに注意してください):

info = """
          CR  FA  CL  Title
          409452  WLAN    656885  Age out RSSI values from buffer in Beacon miss scenario
          415560  WLAN    656886  To Record SMD Event Logging
       """
[[x.strip() for x in row.split('\t') if x.strip()] for row in info.split('\n')]

列の間に複数のスペースがある場合は、これを使用してみてください。

[[x.strip() for x in row.split('  ') if x.strip()] for row in info.split('\n')]

または組み合わせて:

[[x.strip() for x in row.replace('\t', '  ').split('  ') if x.strip()] for row in info.split('\n')]

そして最後にsplit(None、3)を使用します:

[row.split(None, 3) for row in info.split('\n')]
于 2012-11-08T02:34:33.097 に答える