3

PLY lexer で \r (0x0d) と \n (0x0a) を区別するのに問題があります。

最小限の例は次のプログラムです

import ply.lex as lex

# token names
tokens = ('CR', 'LF')

# token regexes
t_CR = r'\r'
t_LF = r'\n'

# chars to ignore
t_ignore  = 'abc \t'

# Build the lexer
lexer = lex.lex()

# lex
f = open('foo', 'r')
lexer.input(f.read())
while True:
    tok = lexer.token()
    if not tok: break
    print(tok)

次のようにファイル foo を作成します。

printf "a\r\n\r\rbc\r\n\n\r" > foo

問題ないように見えることを確認します。

hd foo
00000000  61 0d 0a 0d 0d 62 63 0d  0a 0a 0d                 |a....bc....|
0000000b

ここで、いくつかの CR トークンといくつかの LF トークンを取得すると想定していましたが、次のようになります。

python3 crlf.py 
WARNING: No t_error rule is defined
LexToken(LF,'\n',1,1)
LexToken(LF,'\n',1,2)
LexToken(LF,'\n',1,3)
LexToken(LF,'\n',1,6)
LexToken(LF,'\n',1,7)
LexToken(LF,'\n',1,8)

LFトークンしか取得できないことがわかりました。なぜこれが起こるのか、代わりにどのようにすべきかを知りたいです。

これは、Ubuntu 12.04 の Python 3.2.3 です。

4

1 に答える 1

2

デフォルト モードでファイルを開きます。そのモードでは、、(newline=Noneとりわけ) のいずれかが 行末として扱われ、単一の文字に変換されることを意味します。詳細については、オープン ドキュメントを参照してください。\r\n\r\n\n

newline=''に渡すことでこの動作を無効にすることができopenます。つまり、あらゆる種類の改行を受け入れますが、それらを に正規化することはありません\n

于 2012-11-01T18:54:35.900 に答える