2012-09-30 3 views
2

je suis tombé sur ce comportement inattendu tout en essayant de déboguer le code de pyparsing:comportement pyparsing inattendu

string1 = "this is a test string : that behaves as I expect\n" 
string2 = "this string does not behave as I expect\n" 

field = CharsNotIn(":\n") 
line = field + ZeroOrMore(Literal(":") + field) + LineEnd() 

print line.parseString(string1) 
print line.parseString(string2) 

Ceci produit la sortie suivante:

['this is a test string ', ':', ' that behaves as I expect', '\n'] 
['this string does not behave as I expect'] 

Pour une raison quelconque l'analyseur est en mesure de prendre le caractère de fin de ligne dans string1, mais il est incapable de le ramasser dans string2. Je ne peux même pas comprendre comment il était capable de produire un match pour string2 s'il n'a pas ramassé la fin de la ligne.

Ce comportement semble particulier à la fin de caractères de ligne en utilisant un caractère autre que la fin de la ligne semble fonctionner très bien:

string1 = "this is a test string : that behaves as I expect*" 
string2 = "this string also behaves as I expect*" 

field = CharsNotIn(":*") 
line = field + ZeroOrMore(Literal(":") + field) + Literal("*") 

print line.parseString(string1) 
print line.parseString(string2) 

Ce produit:

['this is a test string ', ':', ' that behaves as I expect', '*'] 
['this string also behaves as I expect', '*'] 

Répondre

1

ligne d'impression pour voir le pseudo -regex ça correspond.

>>> print line 
{!W:(: 
) [{":" !W:(: 
)}]... LineEnd} 

Si je comprends ce droit, il cherche des caractères non du côlon non newline, qui arrête au premier saut de ligne (ce qui dans votre exemple chaine2, prend toute la ligne), pour ensuite rechercher deux points et plus de mots, s'ils existent (ils ne le font pas), alors la nouvelle ligne. Ma conjecture est que l'instance de saut de ligne est supprimée d'une manière ou d'une autre, pas que votre affirmation selon laquelle elle ne correspondrait pas à la chaîne si elle ne pouvait pas correspondre à la nouvelle ligne est fausse.

>>> print line.parseString('xyzyy') 
['xyzyy'] 

Cela ne laisse la question pourquoi il correspond même sans saut de ligne ...