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