簡體   English   中英

正則表達式全部用定界符匹配

[英]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

另一種方法是使用幾個步驟:

  • 你用`START`分割字符串以獲得一個塊列表
  • 您過濾沒有條件的塊
  • 您在每個項目之前插入“ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM