我有以下输入,
OK SYS 10 LEN 20 12 43
1233a.fdads.txt,23 /data/a11134/a.txt
3232b.ddsss.txt,32 /data/d13f11/b.txt
3452d.dsasa.txt,1234 /data/c13af4/f.txt
.
我想提取所有的输入 * 除了 * 包含“OK SYS 10 LEN 20
“的行和包含一个"."
(点)的最后一行。
1233a.fdads.txt,23 /data/a11134/a.txt
3232b.ddsss.txt,32 /data/d13f11/b.txt
3452d.dsasa.txt.1234 /data/c13af4/f.txt
我尝试了以下方法,
for item in output:
match_obj = re.search("^(?!OK) | ^(?!\\.)", item)
if match_obj :
print("got item " + item)
但是它不起作用,因为它不产生任何输出。
8条答案
按热度按时间szqfcxe21#
in action:
别忘了在负向前看后面加上
.*
,否则你将得不到任何匹配jq6vz3qz2#
使用负匹配。(还要注意,默认情况下,正则表达式中的空格是重要的,所以不要用空格隔开。或者,使用re.VERBOSE。)
oxcyiej73#
cx6n0qe34#
为什么不匹配
OK SYS
行而不返回它呢?nbewdwxp5#
如果这是一个文件,您可以简单地跳过第一行和最后一行,并使用
csv
读取其余部分:如果它是一个文件,那么你可以这样做:
ykejflvf6#
正在起作用
h79rfbju7#
你也可以不使用负向预测,你只需要在你想要提取的表达式部分加上括号,这个带括号的结构被命名为
group
。让我们来写Python代码:
输出为:
^OK.*\n
将找到第一行OK语句,但我们不想提取它,所以不带括号。接下来是我们想要捕获的部分:((.|\s)*)
,所以把它放在括号里。在regexp的末尾,我们寻找一个点.
,但我们也不想捕获它。P.S:我发现这个答案对理解群体的力量非常有帮助。https://stackoverflow.com/a/3513858/4333811
8oomwypt8#
如果OK行是第一行,最后一行是点,你可以考虑像这样把它们切掉:
但是,如果这是一个非常大的字符串,您可能会遇到内存问题。