Подтвердить что ты не робот

"отрицательное" соответствие шаблону в python

У меня есть следующий ввод,

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

но он не работает, поскольку он не производит никакого вывода.

4b9b3361

Ответ 1

Смотрите в действии:

matchObj = re.search("^(?!OK|\\.).*", item)

Не забудьте поставить .* после отрицательного внешнего вида, иначе вы не смогли бы получить никакого соответствия; -)

Ответ 2

 if not (line.startswith("OK ") or line.strip() == "."):
     print line

Ответ 3

Используйте отрицательное совпадение. (Также обратите внимание, что пробелы значительны по умолчанию внутри регулярного выражения, поэтому не занимайте места. В качестве альтернативы используйте re.VERBOSE.)

for item in output:
    matchObj = re.search("^(OK|\\.)", item)
    if not matchObj:
        print "got item " + item

Ответ 4

Почему вы не соответствуете строке OK SYS и не возвращаете ее.

for item in output:
    matchObj = re.search("(OK SYS|\\.).*", item)
    if not matchObj:
        print "got item "  + item

Ответ 5

Если это файл, вы можете просто пропустить первую и последнюю строки и прочитать остальные с помощью 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]

Ответ 6

and(re.search("bla_bla_pattern", str_item, re.IGNORECASE) == None)

работает.