在python中具有多个匹配和负面条件的多行正则表达式

时间:2016-04-19 02:11:49

标签: python regex

我正在阅读一个文本文件并尝试捕获每个不同标记的一个参数,这些参数尚未被注释掉。

更具体地说,我有以下输入......

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)

3 个答案:

答案 0 :(得分:3)

您可以逐行执行正则表达式,并过滤掉以%开头的正则表达式:

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']

答案 1 :(得分:2)

试试这个

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

Regex demo

<强>解释
^:根据多行模式sample来开始字符串或行首 .:除了换行符sample之外的任何字符 *:零次或多次sample
|:替代/或操作数sample
\:逃脱一个特殊字符sample
[^x]:一个不是x sample的字符 +:一个或多个sample (...)`:捕获小组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

答案 2 :(得分:1)

所以这里你的正则表达式缩短了一点:

alert.Clicked += (object sender2, UIButtonEventArgs es) => { if (es.ButtonIndex == 0 ) { Console.WriteLine("Não"); } 
else { result = banco.ExecutaDelete(exercicosBanco [indexPath.Row]); 
if (result > 0) { 
exercicosBanco.RemoveAt(indexPath.Row);
ReloadData() ;
} } };

重要的部分在这里:

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

{([^N].+?)} 的位置是您需要区分您想要和不想要的东西的地方。根据你给出的论据,我得到了这个输出:

[^N]