[英]Regex match all with delimiter
我想要的效果:如果在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
我只想在其文本塊中存在condition
時捕獲value
。 沒有匹配的下一個start
。
這是唯一應匹配的情況:
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
另一種方法是使用幾個步驟:
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.*?
在搜索模式的開頭。
您可以結合幾種環視方法 ,以免跳過START
並保持條件序列:
(?s)START(?:(?!START|condition).)*?\b(VALUE)(?=(?:(?!START).)*?condition a(?:(?!START).)*?condition b(?:(?!START).)*?condition c)
在regex101上進行測試,但請注意,這表現很糟糕:]
這確實允許condition a condition a condition b condition c
。 要設置排他條件,請更改condition a(?:(?!START).)*?
和bc部分condition a(?:(?!START|condition).)*?
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.