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