Найти - Пользователи
Полная версия: Pyparsing. Выделить значение переменной типа string между апострофами
Начало » Python для новичков » Pyparsing. Выделить значение переменной типа string между апострофами
1
evovch
Добрый день.

Необходимо отпарсить файл (ISO 10303 STEP), содержащий в себе всякую разную инфу и в том числе строковые переменные
Ниже две строки из файла:
#80=ADVANCED_FACE('PartBody',(#79),#56,.T.) ;
#4=APPLICATION_PROTOCOL_DEFINITION('international standard','config_control_design',1994,#1) ;
На данный момент выглядит так
#!/usr/bin/python
from pyparsing_py2 import *
import string
ap = "\'"
space = " "
non_q_char = space.join([c for c in printables if c not in """_'\~"""])
string_par = Combine(Word(ap, exact=1) + Word(non_q_char) + Word(ap, exact=1))
f = open("Orb.stp", "r")
text = f.read()
f.close()
instances = string_par.searchString(text)
for instance in instances:
print instance
По синтаксису внутри строки разрешаются ПАРЫ апострофов и ПАРЫ обратных слешей.
Теперь вопрос: как сделать так, чтобы обрабатывались эти пары внутри строки:
FILE_NAME('C:\\Documents\\ASD\\ASDSEE\\STEP\\Orb.stp','2009-04-04T09:15:46+00:00',('none'),('none'),'dfgvdfv''sdfdsfsf','fd3','none');
Т.е. чтобы путь (первый агрумент) вместе с \\ входил в string_par и ‘dfgvdfv’'sdfdsfsf' тоже подпадал под правило (там двойной апостроф)

Спасибо, жду ответов, можно здесь, можно на мыло.

В догонку ещё вопрос:

Как правильно обработать замкнутые правила? Как избежать ошибок, что name ‘parameter’ is not defined?
typed_parameter = keyword + opbr + parameter + clbr
untyped_parameter = undefined_parameter | integer | real | string_par | entity_instance_name | enumeration | binary | listed
parameter = typed_parameter | untyped_parameter | omitted_parameter
ok. Пока ответов нет…

Вот что нашёл по 2 вопросу, если кому-то кроме меня не интересно, читайте:
http://pyparsing.wikispaces.com/message/view/Publications/13034711
1 вопрос пока актуален
2 вроде бы как решился с помощью функции Forward()

1 вопрос решился с помощью quotedString
Как ни странно, он именно пары апострофов включает в строку, не разбивает на две. А видимо слэши вообще ест как есть в любых количествах.

Отличный монолог у меня получился…….
evovch
Ещё проблемка возникла
#!/usr/bin/python
from pyparsing_py2 import *
import string
data_head = "DATA;"
end_section = "ENDSEC;"
сharacter = "".join([c for c in printables if c not in """~"""])
dat = Word(сharacter)
data_section = data_head + ZeroOrMore(dat) + end_section
f = open("in.txt", "r")
text = f.read()
f.close()

instances = data_section.searchString(text)
#instances = dat.searchString(text)

for instance in instances:
print instance
in.txt:
DATA;
asdfg asd asg as ga
g asdg a
sg
asg
as
g a4tg134t
1g 1rdt
ENDSEC;
Закоментированный вариант отлично выдаёт мне все слова. А instances = data_section.searchString(text) ничего.
Подскажите, пожалуйста, как создать такое правило:
чтобы первая строка (необязательно кстати строка, можно просто первые 5 символов) была “DATA;”,
а последняя “ENDSEC;”.
Почему же не работает этот код?

Спасибо, надеюсь увидеть комментарии.

Вообще где-то встречал, что якобы pyparsing по умолчанию игнорирует переводы строки. Получается, тогда я могу писать правило для всего файла (т.е. самое верхнее) с учётом того, что файл занимает много строк. Но не получается.

Короче такое чувство что всё-таки переводы строк не игнорируются. а будто парсер работает построчно.

Решилось удалением всех переводов строк.
import re
...
text = re.sub("\n", "", text)
Спасибо.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB