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