2017-04-04 59 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]+