2016-04-05 18 views
2

Basit veri gibi çizgilerle ayrıştırmak için ayarlanmış aşağıdaki:PyParsing: Tüm Literalleri global olarak bastırmak mümkün mü?

aşağıdaki
R1 (a/30) to R2 (b/30), metric 30 

Ben yukarıdan gereken tek veri olarak:

R1, a, 30, R2, 192.168.0.2, 30, 30 

kolayca tüm bu ayrıştırabilir pıhtılaşma ile, ama ya benim çıktısında bir ya da birkaç harfle bitiyor ya da ayrıştırma dilbilgisi içinde özel olarak Literal(thing).suppress() söylemem gerekiyor ki bu da yorucu oluyor.

Word(alphanums) + '(' + Word(alphanums) + '/' + Word(nums) + ... etc. 

ve edebi belirteçleri görmezden gelirler var:

İdeal olarak, ben gibi yukarıda bir gramer yazmak istiyorum. .suppressAllLiterals() gibi bir şey söyleyebilir miyim?

Notlar:

  • yeni PyParsing
  • I dokümanlar okumak ve 5 ya da 6 örnekler
  • Teşekkür google

aradık!

from pyparsing import ...whatever... 
ParserElement.inlineLiteralsUsing(Suppress) 

Şimdi ayrıştırıcı tüm dize hazır Suppress nesneler sarılmış olacak ve yerine, sonuçların dışında kalan: hemen pyparsing aktardıktan sonra diyoruz -

cevap

2

Sen ParserElement bu yöntemi kullanabilirsiniz Varsayılan Literal.

(muhtemelen bu v3.0 varsayılan yapacak, bir gün, ne zaman geriye dönük uyumluluk kırabilir.) Yanıt

+1

Merhaba @ Paul, teşekkür! Bunu denedim - satır içi kullanılan dizeler için çalışıyor gibi görünüyor (örneğin, pp.Word (...) + 'somestring' + pp.Word (...) ', ve zaten olan şeyler için değil pp.Literal olarak adlandırılmıştır (örneğin, 'myLiteral' ile' somestring 'değiştirdiysem) Bu küçük değişiklik, dilbilgisi netliğiyle çok yardımcı oldu.Yeni zaman ayırdığınız için tekrar teşekkürler, çok takdir ediyorum –

+0

her zaman "MyLiteral" veya sadece "myLiteral.suppress()' i de yapabilirsiniz. – PaulMcG

+0

"Bastırma" ("blah") 'ü kullanarak bastırılmış bir literal oluşturabilir ve Suppress sınıfı için Literal yaratabilirsiniz. – PaulMcG

İlgili konular