Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中具有多个匹配项和负条件的多行正则表达式_Python_Regex - Fatal编程技术网

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

python中具有多个匹配项和负条件的多行正则表达式,python,regex,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}\\s

我正在读取一个文本文件,并试图捕获每个不同标记的一个参数,该参数尚未注释掉

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

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)

这是你的正则表达式,稍微缩短了一点:

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

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

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[^{]+{([^}]+)}

说明:
^
:根据多行模式,字符串的开头或行的开头
:除换行符以外的任何字符
*
:零次或多次
|
:交替/或操作数
\
:转义特殊字符
[^x]
:一个非x字符
+
:一个或多个
(…)`:捕获组

输出:

WANT0
WANT1
WANT2
WANT3
OBV_WANT

你能告诉我们你得到了什么吗?当然。。。我得到了你想要的东西,别的什么都没有。情况不清楚。我很难做你想要的正则表达式。我可以得到所有的
想要的,
想要的
,但我也可以得到
不想要的
。请把问题弄清楚这怎么不清楚?我不想要
NOTWANT
,因为行的开头已经用
%
注释了!它确实按照您在回答中定义的方式工作。但是,在阅读实际文件时,它不起作用,注释不会被忽略。而且,我不明白你是如何让它在第一时间忽略前两条注释的。啊,我很抱歉。我不明白“%”应该是一个评论。尼米的答案可能最符合你的要求。你可以试着用负面表情,但是因为你没有固定的长度,所以它们不会真正起作用。示例:re.findall(r'(?我可以要求更详细的解释吗?当我执行
re.findall('(?:^^ |\G)(?!%).\\THISTAG[^{]+{([^}]+},ins.read(),re.MULTILINE)时,我无法让它返回
WANT0
WANT1
WANT2
WANT3
OBV_WANT