对于以下模式,我需要捕获“任何东西”(可以包含除序列\s-
之外的任何字符),B的最后一次出现和C的最后一次出现在三个不同的组中。 B和C可以排列和重复,但是只有在\s-
之后出现时才需要捕获。
any-thing
any-thing -
any-thing - K => only captures any-thing, ignore everything after \s-
any-thing - B
any-thing - C
any-thing - B C
any-thing - C B
any-thing - B B
any-thing - C C
到目前为止,我有(.*)\s-(\s+B|\s+C)*
,但在前两种情况下不起作用。 regex应该可以在Python中使用。
答案 0 :(得分:1)
此正则表达式应执行您想要的操作:
^(.*?)(?:\s-((?:\s+B|\s+C)*)|$)
它将查找一定数量的字符,后跟\s-
和一定数量(0个或更多)的B
s或C
s或行尾。它将与您提供的所有样本数据匹配;第一个字符串在组1中,B
和C
在组2中。
答案 1 :(得分:1)
如果第一部分可以包含除序列\s-
之外的任何字符,则可以使用:
^((?:.(?!-\s))+)(?:\s-)?((?:\s+[BC])*)
请参见regex demo
说明
^
字符串的开头(
开始捕获组
.(?!-\s)
匹配任何字符,后跟否定的前瞻,以断言右侧的内容不是-\s
)+
关闭捕获组并重复1次以上(?:\s-)?
最佳非捕获组,用于匹配空白字符和连字符(
开始捕获组
(?:\s+[BC])*
重复0+次1+个空格字符,后跟B或C )
关闭捕获组答案 2 :(得分:0)
此帮助-> \ w *-\ w +吗? ?-?(B | | C)*
答案 3 :(得分:0)
您可以使用此伴侣
.*\s*-.*
说明
.*
-匹配除换行符以外的所有内容。(贪婪模式)。\s*
-匹配空格零次或多次。-
-与-
匹配(?使其为可选)。.*
-匹配除换行符以外的所有内容。(贪婪模式)。