Комментарий ОП заставил меня осознать мою ошибку: предполагаемая библиотека - regex
, а не встроенная в Python re
.
Использование import regex as re
не только сбило меня с толку, но и заставило библиотеку re
выдать ошибку nothing to repeat
. Это связано с тем, что Dataflow по умолчанию не сохраняет основной сеанс.
Когда выполняется код в вашей функции синтаксического анализа, он не имеет доступа к контексту re
, который вы импортировали во время сборки. Обычно это не удастся с NameError
, но поскольку вы используете правильное имя библиотеки, код предполагает, что вы имеете в виду встроенную библиотеку re
и пытается выполнить ее как таковую.
Если вместо этого вы используете import regex
, вы увидите NameError: name 'regex' is not defined
, что является реальной причиной сбоя кода. Чтобы обойти это, либо переместите оператор импорта в саму функцию синтаксического анализа, либо передайте --save_main_session
в качестве опции для бегуна.
См. здесь для получения более подробной информации.
Старый ответ:
Хотя я не могу сказать, какую версию Python вы используете, похоже, ваше подозрение относительно регулярного выражения верное.
*
- это специальный символ, обозначающий повторы того, что было до него, но (
- это специальный символ, обозначающий группировку, поэтому шаблон, подобный (*SKIP)
, не выглядит грамматически правильным.
В Python 3.7 вышеприведенное выражение даже не компилируется:
python -c 'import re; rx = re.compile(r"""\{[^{}]+\}(*SKIP)(*FAIL)|,""")'
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/home/ajp1/miniconda3/envs/b-building/lib/python3.7/re.py", line 234, in compile
return _compile(pattern, flags)
File "/home/ajp1/miniconda3/envs/b-building/lib/python3.7/re.py", line 286, in _compile
p = sre_compile.compile(pattern, flags)
File "/home/ajp1/miniconda3/envs/b-building/lib/python3.7/sre_compile.py", line 764, in compile
p = sre_parse.parse(p, flags)
File "/home/ajp1/miniconda3/envs/b-building/lib/python3.7/sre_parse.py", line 930, in parse
p = _parse_sub(source, pattern, flags & SRE_FLAG_VERBOSE, 0)
File "/home/ajp1/miniconda3/envs/b-building/lib/python3.7/sre_parse.py", line 426, in _parse_sub
not nested and not items))
File "/home/ajp1/miniconda3/envs/b-building/lib/python3.7/sre_parse.py", line 816, in _parse
p = _parse_sub(source, state, sub_verbose, nested + 1)
File "/home/ajp1/miniconda3/envs/b-building/lib/python3.7/sre_parse.py", line 426, in _parse_sub
not nested and not items))
File "/home/ajp1/miniconda3/envs/b-building/lib/python3.7/sre_parse.py", line 651, in _parse
source.tell() - here + len(this))
re.error: nothing to repeat at position 11
Python 2.7.15 также не принимает его:
python2 -c 'import re; rx = re.compile(r"""\{[^{}]+\}(*SKIP)(*FAIL)|,""")'
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/usr/lib/python2.7/re.py", line 194, in compile
return _compile(pattern, flags)
File "/usr/lib/python2.7/re.py", line 251, in _compile
raise error, v # invalid expression
sre_constants.error: nothing to repeat
Хотя я не знаю, с какими строками вы пытаетесь соответствовать, я подозреваю, что некоторым вашим персонажам нужно сбежать. например "\{[^{}]+\}(\*SKIP)(\*FAIL)|,"