python 正则表达式以匹配来自编译行的文件扩展名

python regex to match file extension from compilation line

我有一个正在尝试解析的编译行,我想要获取的只是带有编译行扩展名的完整文件名,但编译行可以包含不同的文件扩展名,如 '. 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

您可以使用捕获组来获取文件名,并且由于您总是知道哪个标志位于文件名之前(-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']