匹配字符串但不匹配特定模式如果它在Python中

时间:2017-04-04 20:05:26

标签: python regex svn

我正在尝试将字符串一直匹配到结尾,但如果有另一个字符串用空格分隔,那么我只想匹配第一个字符串而不是这个额外的模式。这个额外的模式总是以:

开头
(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]

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

2 个答案:

答案 0 :(得分: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)。所以,最后,它匹配包括换行符在内的每一行 - 这与完全不使用正则表达式相同。

答案 1 :(得分:0)

如果您只想在可能的(?m)^[^(\r\n]+之前匹配

.Text