簡體   English   中英

在python中具有多個匹配和負面條件的多行正則表達式

[英]Multi-line regex with multiple matches and negative conditions in python

我正在讀取一個文本文件並嘗試捕獲每個不同標記的一個參數,這些參數尚未被注釋掉。

更具體地說,我有以下輸入......

maybe there is some text \THISTAG[arg1=1,argtwo]{WANT0}
% \THISTAG[arg1=1,argtwo]{NOTWANT}
% blah blah \THISTAG[arg1=1,argtwo]{NOTWANT}
\THISTAG[arg1=1,argtwo]{WANT1}\THISTAG[arg1=1,argtwo]{WANT2}\\stuff
\sometag{stuff I don't want}[{\THISTAG[arg1=1,argtwo]{WANT3}}]{more stuff I don't want}
\THISTAG[arg1=1,argtwo]{OBV_WANT}

我想要以下輸出

WANT0
WANT1
WANT2
WANT3
OBV_WANT

到目前為止,我有以下代碼,但沒有達到我想要的效果

with open(target, "r") as ins:
    f = re.findall(r'^(?:[^%])?\\THISTAG\[.+\]{(.+?)}(?:{.+})?', ins.read(),re.MULTILINE)

您可以逐行執行正則表達式,並過濾掉以%開頭的那些:

import re

res = []
with open('test.txt') as f:
    res = sum([re.findall('\\THISTAG\[.*?\]{(.*?)}', line) 
               for line in f if not line.startswith('%')
              ], [])

    print res # ['WANT0', 'WANT1', 'WANT2', 'WANT3', 'OBV_WANT']

試試這個

^%.*|\\THISTAG[^{]+{([^}]+)}

正則表達式演示

說明:
^ :根據多行模式樣本開始字符串或開始行
. :除了換行符的任何字符樣本
*樣品零次或多次
| :Alternation / OR操作數示例
\\ :逃避特殊字符樣本
[^x] :一個不是x sample的字符
+ :一個或多個樣本
(...)`:捕獲小組樣本

import re
p = re.compile(ur'^%.*|\\THISTAG[^{]+{([^}]+)}', re.MULTILINE)
test_str = u"maybe there is some text \THISTAG[arg1=1,argtwo]{WANT0}\n% \THISTAG[arg1=1,argtwo]{NOTWANT}\n% blah blah \THISTAG[arg1=1,argtwo]{NOTWANT}\n\THISTAG[arg1=1,argtwo]{WANT1}\THISTAG[arg1=1,argtwo]{WANT2}\\stuff\n\sometag{stuff I don't want}[{\THISTAG[arg1=1,argtwo]{WANT3}}]{more stuff I don't want}\n\THISTAG[arg1=1,argtwo]{OBV_WANT}"

g = re.findall(p, test_str)
for m in g:
    if m:
        print m

輸出:

WANT0
WANT1
WANT2
WANT3
OBV_WANT

所以這里你的正則表達式縮短了一點:

re.findall(r'\\THISTAG\[.+?\]{([^N].+?)}', a,re.MULTILINE)

重要的是這里:

{([^N].+?)}

我有[^N]的地方,你需要區分你想要和不想要的東西。 根據你給出的參數,我得到了這個輸出:

>>> print(a)
\THISTAG[arg1=1,argtwo]{WANT0}
% \THISTAG[arg1=1,argtwo]{NOTWANT}
% blah blah \THISTAG[arg1=1,argtwo]{NOTWANT}
\THISTAG[arg1=1,argtwo]{WANT1}\THISTAG[arg1=1,argtwo]{WANT2}\stuff
\sometag{stuff I don't want}[{\THISTAG[arg1=1,argtwo]{WANT3}}]{more stuff I don'    t want}
\THISTAG[arg1=1,argtwo]{OBV_WANT}
>>>
>>> re.findall(r'\\THISTAG\[.+?\]{([^N].+?)}', a,re.MULTILINE)
['WANT0', 'WANT1', 'WANT2', 'WANT3', 'OBV_WANT']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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