Разделить команду Maya ASCII на фрагменты с помощью регулярных выражений - PullRequest
1 голос
/ 07 марта 2019

Я изо всех сил пытался написать однострочное регулярное выражение, которое разбивает все, что мне нужно. Я действительно хочу исчерпать все свои возможности, прежде чем прибегнуть к повторной оценке моих данных.

В настоящее время я использую это регулярное выражение для разделения одной строки данных ascii на фрагменты:

line = 'setAttr -s 2 ".iog[0].og"'
re.split(r'("[^"\\]*(?:\\.[^"\\]*)*"|[^\s();]+)', line)

// Result: ['setAttr', '-s', '2', '".iog[0].og"']

Что я действительно хочу, так это захватить только текст внутри строковых кавычек вместе со всеми обычными словами, числами и флагами:

// Result: ['setAttr', '-s', '2', '.iog[0].og']

Я знаю, что это кажется глупым, но время выполнения является основным фактором или проблемой для этого кода. В настоящее время о Shlex не может быть и речи, поскольку обработка тысяч строк данных занимает слишком много времени.

Кто-нибудь знает такое выражение?

1 Ответ

1 голос
/ 08 марта 2019

Вы можете захватить нужные вам части с помощью двух групп захвата, а затем объединить их:

r'"([^"\\]*(?:\\.[^"\\]*)*)"|([^\s();]+)'
   ^                      ^  ^         ^

Это будет работать, потому что группы захвата будут заполняться только по одной, одна из них всегда будет пустой:

["{}{}".format(x,y) for x, y in re.findall(r'"([^"\\]*(?:\\.[^"\\]*)*)"|([^\s();]+)', line)]

См. Демоверсию Python

...