Как вернуть список строк, которые не соответствуют определенному шаблону? - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь вернуть из текстового файла все результаты, которые не соответствуют определенному шаблону, но у меня возникают проблемы с синтаксисом.

pattern is [A-Z]+\_[A-Z0-9]+\_[0-9]+\_[0-9]+\.[A-Z]{3}

Попытка выполнить следующее безуспешно:

'^(?![A-Z]+\_[A-Z0-9]+\_[0-9]+\_[0-9]+\.[A-Z]{3}$).*$'

r'^(?!([A-Z]+\_[A-Z0-9]+\_[0-9]+\_[0-9]+\.[A-Z]{3}).)*$'

Ниже приведен код, соответствующий шаблону, теперь мне нужно найти все те записи, которые не соответствуют.

pattern = r'[A-Z]+\_[A-Z0-9]+\_[0-9]+\_[0-9]+\.[A-Z]{3}'

regex1 = re.compile(pattern, flags = re.IGNORECASE)

regex1.findall(text1)

Пример данных следующий:

plos_annotate5_1375_1.txt plos_annotate5_1375_2.txt plos_anno% tate5_1375_3.txt plos_annotate6_1032_1.txt

Третья строка - это то, что я хотел бы вытащить

Ответы [ 3 ]

2 голосов
/ 04 апреля 2019

Зачем использовать отрицание в регулярном выражении, если вы можете сделать это в Python?

strings_without_rx = [s for s in the_strings if not regex1.search(s)]

Если вы хотите сканировать строки файла, вам даже не нужно хранить их все, потому что открытый файл - это итерация его строк:

with open("some.file") as source:
  lines_without_rx = [s for s in source if not regex1.search(s)]
# Here the file is auto-closed.
0 голосов
/ 04 апреля 2019

Я бы предложил использовать отрицательное прогнозное утверждение с вашим шаблоном:

r'(?![A-Z]+\_[A-Z0-9]+\_[0-9]+\_[0-9]+\.[A-Z]{3}[^A-Za-z0-9_+\.-]+)'

Без какого-либо цикла это даст вам все шаблоны, которые не совпадают, если вы используете его с findall:

re.findall(r'(?![A-Z]+\_[A-Z0-9]+\_[0-9]+\_[0-9]+\.[A-Z]{3}[^A-Za-z0-9_+\.-]+)')
0 голосов
/ 04 апреля 2019

Вы можете просто проверить, что ваше регулярное выражение не имеет ничего общего:

if regex.match(text1) is None:
    # Do magic you need
...