Python 正则表达式使用分隔符匹配所有

Python 正则表达式使用分隔符匹配所有,python,regex,Python,Regex,我想要的效果是:如果在y之前未找到x,则失败 import re a = '''START aaaadkdklfje VALUE aaaadkdklfjeaaaadkdklfjeaaaadkdklfje aaaadkdklfjeaaaadkdklfjeaaaadkdklfjeaaaadkdklfjeaaaadkdklfjeaaaadkdklfje aaaadkdklfjeaaaadkdklfje aaaadkdklfje aaaadkdklfje aaaadkdklfje c

我想要的效果是:如果在
y
之前未找到
x
,则失败

import re

a = '''START aaaadkdklfje VALUE aaaadkdklfjeaaaadkdklfjeaaaadkdklfje aaaadkdklfjeaaaadkdklfjeaaaadkdklfjeaaaadkdklfjeaaaadkdklfjeaaaadkdklfje aaaadkdklfjeaaaadkdklfje          aaaadkdklfje
aaaadkdklfje
aaaadkdklfje condition a
aaaadkdklfje
aaaadkdklfje
aaaadkdklfje condition b
                          aaaadkdklfje z
                          aaaadkdklfjeaaaadkdklfje        aaaadkdklfjeqqqsdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfsdfsdf 
condition c

???kjij
START...'''

b = re.findall(r'START condition a (VALUE).+?condition b.+?condition c(?!START)', a, re.DOTALL)
if b:
    for x in b:
        print x
我只想在其文本块中存在
条件
s时捕获
。没有匹配通过下一个
开始

这是唯一应该匹配的情况:

start
?, value, ?, condition a, ?, condition b, ?, condition c # i want the matching to be done only in here
start
...
不是这个:

start
?, value, condition a, ?
start
?, value, ?, condition b, condition c
start
为了不跳过
开始
和维护条件序列,您可以组合几个:

(?s)START(?:(?!START|condition).)*?\b(VALUE)(?=(?:(?!START).)*?condition a(?:(?!START).)*?condition b(?:(?!START).)*?condition c)
但请注意,这是一个糟糕的性能:]

这允许
条件a条件a条件b条件c
。若要创建独占条件,请将
条件a(?(?!START.)*?
和b c部分更改为
条件a(?(?!START | condition.)*?

您可以将多个部分组合起来,以不跳过
启动
并维护条件顺序:

(?s)START(?:(?!START|condition).)*?\b(VALUE)(?=(?:(?!START).)*?condition a(?:(?!START).)*?condition b(?:(?!START).)*?condition c)
但请注意,这是一个糟糕的性能:]

这允许
条件a条件a条件b条件c
。若要创建独占条件,请将
条件a(?(?!START.)*?
和b c部分更改为
条件a(?(?!START | condition.)*?

您可以将多个部分组合起来,以不跳过
启动
并维护条件顺序:

(?s)START(?:(?!START|condition).)*?\b(VALUE)(?=(?:(?!START).)*?condition a(?:(?!START).)*?condition b(?:(?!START).)*?condition c)
但请注意,这是一个糟糕的性能:]

这允许
条件a条件a条件b条件c
。若要创建独占条件,请将
条件a(?(?!START.)*?
和b c部分更改为
条件a(?(?!START | condition.)*?

您可以将多个部分组合起来,以不跳过
启动
并维护条件顺序:

(?s)START(?:(?!START|condition).)*?\b(VALUE)(?=(?:(?!START).)*?condition a(?:(?!START).)*?condition b(?:(?!START).)*?condition c)
但请注意,这是一个糟糕的性能:]


这允许
条件a条件a条件b条件c
。若要创建独占条件,请将
条件a(?(?!开始)。*?
和b c部分更改为
条件a(?(?!开始|条件)。*?

另一种方法包括使用几个步骤:

  • 您使用“开始”分割字符串以获得块列表
  • 您可以筛选不具备条件的块
  • 您可以在每个项之前插入“开始”。
    • blocks = re.split(r'\bSTART\b', s)
      blocks = filter(lambda x: re.search(r'condition a.*?condition b.*?condition c', x), blocks[1:])
      blocks = map(lambda x: 'START'+x, blocks)
      

      注意:如果希望条件位于关键字
      值之后
      ,请在搜索模式的开头添加
      \bVALUE\b.*?

      另一种方法包括使用以下几个步骤:

      • 您使用“开始”分割字符串以获得块列表
      • 您可以筛选不具备条件的块
      • 您可以在每个项之前插入“开始”。
        • blocks = re.split(r'\bSTART\b', s)
          blocks = filter(lambda x: re.search(r'condition a.*?condition b.*?condition c', x), blocks[1:])
          blocks = map(lambda x: 'START'+x, blocks)
          

          注意:如果希望条件位于关键字
          值之后
          ,请在搜索模式的开头添加
          \bVALUE\b.*?

          另一种方法包括使用以下几个步骤:

          • 您使用“开始”分割字符串以获得块列表
          • 您可以筛选不具备条件的块
          • 您可以在每个项之前插入“开始”。
            • blocks = re.split(r'\bSTART\b', s)
              blocks = filter(lambda x: re.search(r'condition a.*?condition b.*?condition c', x), blocks[1:])
              blocks = map(lambda x: 'START'+x, blocks)
              

              注意:如果希望条件位于关键字
              值之后
              ,请在搜索模式的开头添加
              \bVALUE\b.*?

              另一种方法包括使用以下几个步骤:

              • 您使用“开始”分割字符串以获得块列表
              • 您可以筛选不具备条件的块
              • 您可以在每个项之前插入“开始”。
                • blocks = re.split(r'\bSTART\b', s)
                  blocks = filter(lambda x: re.search(r'condition a.*?condition b.*?condition c', x), blocks[1:])
                  blocks = map(lambda x: 'START'+x, blocks)
                  



                  注意:如果你想把条件放在关键字
                  VALUE
                  之后,请在搜索模式的开头添加
                  \bVALUE\b.*.

                  问题对我来说不清楚。这里也是一样,我不明白这个问题。条件应该总是按相同的顺序(a,b,c)排列,还是按不同的顺序(b,c,a)或(c,a,b)?@Jonny5是的,看起来是这样。@CasimiritHippolyte是的,相同的顺序。问题对我来说不清楚。同样的,我不理解这个问题,条件应该总是以相同的顺序(a,b,c),或者它们可能有不同的顺序(b,c,a)或(c,a,b)?@Jonny5是的,看起来是这样。@CasimiritHippolyte是的,同样的顺序。问题对我来说不清楚。。同样的这里,我不理解这个问题。条件是否应该总是以相同的顺序(a,b,c),或者它们可能有不同的顺序(b,c,a)或(c,a,b)?@Jonny5是的,看起来是这样。@Casimirithippolyte是的,相同的顺序。问题对我来说不清楚。。同样的这里,我不明白这个问题:条件应该总是以相同的顺序(a,b,c),还是它们可能有不同的顺序(b,c,a)或(c,a,b)?@Jonny5是的,看起来是这样。@Casimirithippolyte是的,相同的顺序。哦,在每个表达式之间,它检查每个字符后的
                  start
                  ?有趣地使用
                  (?:(?!START | condition)。*?
                  有点多余,因为您同时使用
                  | condition
                  和非贪婪量词。如果您在开始时使用
                  (?:(?!START | condition)。*
                  (?:(!START)。)*?
                  @casimirithippolyte您的意思是在开始时使用类似
                  开始条件b值…条件a。。。Bc
                  可以吗?如果我改为贪婪,它会显示更多的步骤。我相信你已经把
                  (?:(?!START | condition)。*?
                  放在了所有地方。不,第一次使用
                  (?:(?!START | VALUE)。*
                  @casimirithippolyte我明白了!但这将允许一个
                  条件
                  出现在
                  之前。我不确定,我最好保持原样。请随意编辑:]或发布答案。哦,在每个表达式之间,它会在每个字符后检查
                  start
                  ?有趣地使用
                  (?:(?!START | condition)。*?
                  有点多余,因为您同时使用
                  | condition
                  和非贪婪量词。如果您在开始时使用
                  (?:(?!START | condition)。*
                  (?:(!START)。)*?
                  @casimirithippolyte您的意思是在开始时使用类似
                  开始条件b值…条件a。。。Bc
                  可以吗?如果我改为贪婪,它会显示更多的步骤。我相信你已经把
                  (?:(?!START | condition)。*?
                  放在了所有地方。否,对于第一次使用
                  (?:(?!START | V