2017-04-04 90 views
1

我想匹配一个字符串一路到最后,但如果有另一个字符串由空格分隔,那么我只想匹配第一个字符串而不是这个额外的模式这种额外的图案总是使用:匹配字符串,但不匹配特定模式,如果它在Python中

(from 

下面是一组字符串的一个例子:

M /trunk 
M /trunk/src/chip/GCC/ARMCMx/STM32F4xx/vectors.c 
A /trunk/src/hal/include/spdif.h (from /branches/spdif_446/src/hal/include/spdif.h:1078) 
M /trunk/src/hal/platforms/STM32/SAI/sai_lld.h 
A /trunk/src/hal/platforms/STM32/SPDIF (from /branches/spdif_446/src/hal/platforms/STM32/SPDIF:1078) 
A /trunk/src/hal/src/spdif.c (from /branches/spdif_446/src/hal/src/spdif.c:1078) 

因此,大家可以看到,其中的几个行有一个额外的字符串后的初始路径显示。显示我的代码提交来自哪个分支。我只想要字符串的开始部分,一直到路径的末尾。我不想要显示它来自哪个分支的部分。我会如何去做这件事?

我想这会工作:

(.+)[\s] 

但是,整条生产线相匹配,我不知道为什么。谢谢你的帮助。

+0

怎么样一个简单的'(M?)^(?:(\ S * \())+' – sln

+0

?!。 @sln:前瞻*太贵*而且不需要,请将[** yours **](https://regex101.com/r/cBAOPA/2/)与[** mine **](https ://regex101.com/r/cBAOPA/1/),并且看到你的步骤需要多达10步才能达到相同的结果。 – Jan

+0

@Jan - 对的就是你! – sln

回答

0

看来,你可以使用

^[A-Z]+\s+(\S+) 

...并采取第一组,见a demo on regex101.com


Python这将是:

import re 

string = """ 
M /trunk 
M /trunk/src/chip/GCC/ARMCMx/STM32F4xx/vectors.c 
A /trunk/src/hal/include/spdif.h (from /branches/spdif_446/src/hal/include/spdif.h:1078) 
M /trunk/src/hal/platforms/STM32/SAI/sai_lld.h 
A /trunk/src/hal/platforms/STM32/SPDIF (from /branches/spdif_446/src/hal/platforms/STM32/SPDIF:1078) 
A /trunk/src/hal/src/spdif.c (from /branches/spdif_446/src/hal/src/spdif.c:1078) 
""" 

rx = re.compile(r'^[A-Z]+\s+(\S+)', re.MULTILINE) 
files = rx.findall(string) 
print(files) 

# ['/trunk', '/trunk/src/chip/GCC/ARMCMx/STM32F4xx/vectors.c', 
# '/trunk/src/hal/include/spdif.h', '/trunk/src/hal/platforms/STM32/SAI/sai_lld.h', 
# '/trunk/src/hal/platforms/STM32/SPDIF', '/trunk/src/hal/src/spdif.c'] 


最后,回答您最初的问题,模式 (.+)[\s]匹配任何字符( .,除换行符)至少一次,但可能更高达结束该线。随后是一个(在这种情况下不必要的)字符类( [...]),其中包括空格( \s)。所以,最后,它匹配包括换行符在内的每一行 - 这与完全不使用正则表达式相同。

0

如果你只是想之前可能(与之相匹配的是

(?m)^[^(\r\n]+