python регулярное выражение для соответствия расширению файла из строки компиляции - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть строка компиляции, которую я пытаюсь проанализировать, все, что я пытаюсь получить, это полное имя файла с расширением из строки компиляции, но строка компиляции может содержать другое расширение файла, например '. c 'или' .asm 'или'. cpp 'и, конечно, порядок параметров может быть другим. Например:

gcc -DDEF_SOMETHING -g3 -Iinclude -Wall -c file1.c -o file1.o

или

gcc -DDEF_SOMETHING -g3 -Iinclude -Wall -c file1.asm -o file1.o

или

gcc -DDEF_SOMETHING -g3 -Iinclude -Wall -c file1.asm.c -o file1.asm.o

или

gcc -DDEF_SOMETHING -g3 -Iinclude -Wall -o file1.o -c file1.c

или

gcc -DDEF_SOMETHING -g3 -Iinclude -Wall -o file1.asm.o -c file1.asm.c

или

gcc -DDEF_SOMETHING -g3 -Iinclude -Wall -c -o file1.asm.o file1.asm.c

Имена файлов иногда заключаются в "например:

gcc -DDEF_SOMETHING -g3 -Iinclude -Wall -c "file1.c" -o "file1.o"
gcc -DDEF_SOMETHING -g3 -Iinclude -Wall -c "file1.asm" -o file1.o"
gcc -DDEF_SOMETHING -g3 -Iinclude -Wall -c "file1.asm.c" -o "file1.asm.o"
gcc -DDEF_SOMETHING -g3 -Iinclude -Wall -o "file1.o" -c "file1.c"
gcc -DDEF_SOMETHING -g3 -Iinclude -Wall -o "file1.asm.o" -c "file1.asm.c"

Я пробовал следующее регулярное выражение в python3:

r'(?:\")?(\S+(?:\.cpp|\.cxx|\.cc|\.c|\.asm|\.s))(?:\")?'

и

r'(?:\")?(\S+(?:\.cpp|\.cxx|\.cc|\.c|\.asm|\.s)+)(?:\")?'

но я получаю неправильные результаты, например, для последнего полученного случая: file1.asm

1 Ответ

1 голос
/ 22 апреля 2020

Вы можете использовать группы захвата для получения имени файла, и, поскольку вы всегда знаете, какой флаг предшествует имени файла (-c или -o), вы можете просто получить целое слово после него.

Это регулярное выражение:

(?<!-o)\s"?([^-]+?\.[^\s"]+)

И вы можете использовать его в сценарии так:

import re

pattern = r'(?<!-o)\s"?([^-]+?\.[^\s"]+)'
matcher = re.compile(pattern)

matcher.findall("gcc -DDEF_SOMETHING -g3 -Iinclude -Wall -c file1.c -o file1.o")
# ['file1.c']

matcher.findall("gcc -DDEF_SOMETHING -g3 -Iinclude -Wall -c file1.asm -o file1.o")
# ['file1.asm']

matcher.findall("gcc -DDEF_SOMETHING -g3 -Iinclude -Wall -c file1.asm.c -o file1.asm.o")
# ['file1.asm.c']

matcher.findall("gcc -DDEF_SOMETHING -g3 -Iinclude -Wall -o file1.o -c file1.c")
# ['file1.c']

matcher.findall("gcc -DDEF_SOMETHING -g3 -Iinclude -Wall -o file1.asm.o -c file1.asm.c")
# ['file1.asm.c']

matcher.findall('gcc -DDEF_SOMETHING -g3 -Iinclude -Wall -o "file1.asm.o" -c "file1.asm.c"')
# ['file1.asm.c']

matcher.findall('gcc -DDEF_SOMETHING -g3 -Iinclude -Wall -c -o file1.asm.o file1.asm.c')
# ['file1.asm.c']
...