带有排列和重复的正则表达式

时间:2018-12-14 06:14:30

标签: python regex

对于以下模式,我需要捕获“任何东西”(可以包含除序列\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中使用。

4 个答案:

答案 0 :(得分:1)

此正则表达式应执行您想要的操作:

^(.*?)(?:\s-((?:\s+B|\s+C)*)|$)

它将查找一定数量的字符,后跟\s-和一定数量(0个或更多)的B s或C s或行尾。它将与您提供的所有样本数据匹配;第一个字符串在组1中,BC在组2中。

Demo on regex101

答案 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*-匹配空格零次或多次。
  • --与-匹配(?使其为可选)。
  • .*-匹配除换行符以外的所有内容。(贪婪模式)。

Demo