Как отфильтровать массив с помощью регулярных выражений? - PullRequest
0 голосов
/ 27 апреля 2018

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

Данные, с которыми я работаю, представляют собой большой массив строк различной длины. Предвосхищая фильтр регулярных выражений, я создал индекс всех строк определенной длины, и в конечном итоге я хотел бы установить этот индекс на подстановку с помощью фильтра регулярных выражений.

Я создал следующую функцию, предназначенную для фильтрации этого индекса:

# Remove all indices corresponding to peptides contaning Cs.
def remove_cs(peptide_arr, indices_arr):
    indices_peptide_arr = peptide_arr[indices_arr]
    r = re.compile(b'C')
    v_search = np.vectorize(lambda x: not bool(r.search(x, re.IGNORECASE)))
    indices_filter = v_search(indices_peptide_arr)
    filtered_indices_arr = indices_arr[indices_filter]
    return filtered_indices_arr

Цель вышеупомянутой функции состоит в том, чтобы поднастроить массив индексов, заданный в качестве входных данных, чтобы он содержал только те индексы, соответствующие значения которых не содержат никаких C. В качестве входных данных приведены полная нефильтрованная пептидная матрица и матрица индекса отбора. Похоже, это работает для фильтрации большинства желаемых индексов, однако, при проверке фильтра, некоторые из них оказываются несоответствующими. Например, индекс, соответствующий b'ACAAAAAA', все еще возвращается. Более того, похоже, что во всех случаях, когда регулярное выражение отсутствует, соответствующий пептид содержит C в качестве одного из первых двух символов, что, я считаю, имеет значение для этой ошибки.

Следующий небольшой пример сценария иллюстрирует проблему. Хотя ожидается, что будет возвращено только 2 (индекс, соответствующий «AAAA»), также возвращается 6 (индекс, соответствующий «ACAA»).

peptide_list = ['AA', 'AAA', 'AAAA', 'AAAC', 'AACA', 'AACC', 'ACAA', 'ACAC', 'ACCC']
peptide_byte_list = [i.encode() for i in peptide_list]
peptide_arr = np.array(peptide_byte_list)
indices_arr = np.array([2, 3, 4, 5, 6, 7, 8])
print(remove_cs(peptide_arr, indices_arr))

Буду признателен за понимание того, почему в моем текущем регулярном выражении отсутствуют какие-либо совпадения, встречающиеся в первых двух символах строки.

1 Ответ

0 голосов
/ 27 апреля 2018

РЕДАКТИРОВАТЬ Форма метода search не принимает аргумент flags, поэтому IGNORECASE (что равно 2) интерпретируется как pos.

Переместите его на вызов compile, и ошибка исчезнет:

# Remove all indices corresponding to peptides contaning Cs.
def remove_cs(peptide_arr, indices_arr):
    indices_peptide_arr = peptide_arr[indices_arr]
    r = re.compile(b'C', re.IGNORECASE)
    v_search = np.vectorize(lambda x: not bool(r.search(x)))
    indices_filter = v_search(indices_peptide_arr)
    filtered_indices_arr = indices_arr[indices_filter]
    return filtered_indices_arr

print(remove_cs(peptide_arr, indices_arr))
# [2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...