2016-09-05 3 views
0

Я пытаюсь обнаружить все set из файла CMake с помощью питона регулярных выражений, Ф.О. ниже файла:Python не удается скомпилировать регулярное выражение

# Library to include 
set(LIB_TO_INCLUDE 
     a 
     b 
     c) 

# comon code (inclusion in source code) 
set(SHARED_TO_INCLUDE d e f) 

# Library to include 
set(THIRD_PARTY g h) 

Я хотел бы получить:

LIB_TO_INCLUDE a b c 
SHARED_TO_INCLUDE d e f 
THIRD_PARTY g h 

Я проверил регулярное выражение set\((?s:[^)])*?\) (получить все, кроме ) предметов, следующих за set(), используя regex101.com (см. https://regex101.com/r/aB5tX2/1), он, по-видимому, делает то, что я хочу.

Теперь, когда я пытаюсь запустить re.compile(r'set\((?s:[^)])*?\)') из Python, я получаю ошибку:

File "private\python_scripts\convert.py", line 34, in create_sde_files 
    pattern = re.compile(r'set\((?s:[^)])*?\)') File "b:\dev\vobs_ext_2015\tools_ext\python\Python34_light\lib\re.py", line 223, in compile 
    return _compile(pattern, flags) File "b:\dev\vobs_ext_2015\tools_ext\python\Python34_light\lib\re.py", line 294, in _compile 
    p = sre_compile.compile(pattern, flags) File "b:\dev\vobs_ext_2015\tools_ext\python\Python34_light\lib\sre_compile.py", line 568, in compile 
    p = sre_parse.parse(p, flags) File "b:\dev\vobs_ext_2015\tools_ext\python\Python34_light\lib\sre_parse.py", line 760, in parse 
    p = _parse_sub(source, pattern, 0) File "b:\dev\vobs_ext_2015\tools_ext\python\Python34_light\lib\sre_parse.py", line 370, in _parse_sub 
    itemsappend(_parse(source, state)) File "b:\dev\vobs_ext_2015\tools_ext\python\Python34_light\lib\sre_parse.py", line 721, in _parse 
    raise error("unknown extension") sre_constants.error: unknown extension 

этот вид регулярных выражений не поддерживается Python?

+0

Python не поддерживает '(s:. ', Нет Вы можете использовать' (ы) 'или' re.S' –

ответ

1

Это следует сделать это: set\(([^)]*?)\)

Модификатор «одна строка» передается в качестве аргумента при компиляции регулярного выражения:

>>> t = """set(LIB_TO_INCLUDE 
...   a 
...   b 
...   c)""" 
>>> 
>>> pattern = r'set\(([^)]*?)\)' 
>>> 
>>> regex = re.compile(pattern, re.S) 
>>> 
>>> result = regex.search(t).groups()[0] 
>>> result 
'LIB_TO_INCLUDE \n  a\n  b\n  c' 

Вы можете устранить дополнительный интервал и новые строки:

>>> ' '.join(x.strip() for x in result.split('\n')) 
'LIB_TO_INCLUDE a b c' 

Обратите внимание, что если вы переключитесь на «python» в «Flavors» слева, вы получите ошибки, которые вызвал ваш конкретный формат.

EDIT: получить все (3) соответствует вам нужно использовать <regex>.findall(...) вместо search.

>>> tt = """# Library to include 
... set(LIB_TO_INCLUDE 
...   a 
...   b 
...   c) 
... 
... # comon code (inclusion in source code) 
... set(SHARED_TO_INCLUDE d e f) 
... 
... # Library to include 
... set(THIRD_PARTY g h)""" 
>>> 

>>> result = regex.findall(tt) 
>>> result 
['LIB_TO_INCLUDE \n  a\n  b\n  c', 'SHARED_TO_INCLUDE d e f', 'THIRD_PARTY g h'] 
+0

Спасибо за помощь?.! – jpo38

Смежные вопросы