我有以下输入,
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:
matchObj = re.search("^(?!OK) | ^(?!\\.)", item)
if matchObj:
print "got item " + item
但它不起作用,因为它不会产生任何输出。
答案 0 :(得分:39)
答案 1 :(得分:4)
if not (line.startswith("OK ") or line.strip() == "."):
print line
答案 2 :(得分:4)
使用否定匹配。 (另请注意,默认情况下,空格很重要,因此请不要将空格分开。或者,使用re.VERBOSE。)
for item in output:
matchObj = re.search("^(OK|\\.)", item)
if not matchObj:
print "got item " + item
答案 3 :(得分:2)
为什么不匹配OK SYS行而不返回它。
for item in output:
matchObj = re.search("(OK SYS|\\.).*", item)
if not matchObj:
print "got item " + item
答案 4 :(得分:1)
如果这是一个文件,您只需跳过第一行和最后一行,然后使用csv
阅读其余内容:
>>> s = """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
... ."""
>>> stream = StringIO.StringIO(s)
>>> rows = [row for row in csv.reader(stream,delimiter=',') if len(row) == 2]
>>> rows
[['1233a.fdads.txt', '23 /data/a11134/a.txt'], ['3232b.ddsss.txt', '32 /data/d13f11/b.txt'], ['3452d.dsasa.txt', '1234 /data/c13af4/f.txt']]
如果是文件,那么你可以这样做:
with open('myfile.txt','r') as f:
rows = [row for row in csv.reader(f,delimiter=',') if len(row) == 2]
答案 5 :(得分:0)
您也可以这样做,而不会产生负面影响。您只需要在要提取的表达式部分添加括号即可。带有括号的结构称为group
。
让我们编写python代码:
string = """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
.
"""
search_result = re.search(r"^OK.*\n((.|\s)*).", string)
if search_result:
print(search_result.group(1))
输出为:
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.*\n
会找到带有OK语句的第一行,但我们不想提取它,因此不要在括号中加上。接下来是我们要捕获的部分:((.|\s)*)
,因此将其放在括号内。在正则表达式的结尾,我们寻找一个点.
,但我们也不想捕获它。
P.S:我发现这个答案对理解团体的力量非常有帮助。 https://stackoverflow.com/a/3513858/4333811
答案 6 :(得分:0)
如果OK行是第一行,最后一行是点,您可以考虑将它们切成这样:
TestString = '''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
.
'''
print('\n'.join(TestString.split()[1:-1]))
但是,如果这是一个很大的字符串,则可能会遇到内存问题。