【问题标题】:python regex to match file extension from compilation linepython 正则表达式匹配编译行中的文件扩展名
【发布时间】:2020-04-22 10:19:37
【问题描述】:

我有一个我试图解析的编译行,我想要得到的只是完整的文件名和编译行的扩展名,但是编译行可以包含不同的文件扩展名,比如“.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)+)(?:\")?'

但我得到了错误的结果 例如,对于我得到的最后一种情况: 文件1.asm

【问题讨论】:

  • 你想要的是this吗?

标签: regex python-3.x parsing compilation file-extension


【解决方案1】:

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

【讨论】:

  • 这个案例怎么样:"gcc -DDEF_SOMETHING -g3 -Iinclude -Wall -c -o file1.asm.o file1.asm.c" 这也是一个有效的编译行?
  • @sagi 我也编辑了我的答案来解决这个用例(:
  • 谢谢,但我只想捕获源文件,而不是结果对象
  • @sagi 再次编辑,添加了一个否定的lookbehind ((?&lt;!-o)),它会抛出-o前面的结果
  • 谢谢,它似乎可以完成这项工作,只需要使用更复杂的编译命令进行测试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多