Поиск точного совпадения в строке с разными размерами и с похожими совпадениями

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

Допустим, у нас есть следующие строки:

GEO1D1JXUQ2LSO

GOE22D2OKDLALKCDSI

EO212D0FM2KDLA

LAFD21D1FM2KDF3BLA

Что известно о строках, так это префикс (GEO, GOE, EO, LAFD) и то, что после префикса есть 1, 2 или 3 цифры, а затем буква D, как показано в примере.

У меня есть префиксы заранее, но это все. Как я могу выполнить поиск по каждой строке и определить, к какой группе она принадлежит?

Примечание: в строке есть некоторая информация (например, число после буквы D), которая мне тоже нужна, но я сосредоточусь только на том, как определить, частью какой группы она является, чтобы затем получить больше информации об этой группе.

Я застрял, потому что есть некоторые префиксы, которые могут существовать внутри префиксов, например EO в GEO.

Вы пробовали что-нибудь с точки зрения кода?

Devesh Kumar Singh 27.05.2019 18:47
EO и GEO не являются двусмысленными, если они являются префиксами — просто используйте startswith().
Blorgbeard 27.05.2019 18:48

Пока нет, у меня есть код для предыдущего синтаксического анализа, такого как использование re.compile с поиском и сопоставлением, но здесь я хотел знать, как решить проблему.

George 27.05.2019 18:50

@Blorgbeard как насчет префиксов AOI и AOIO?

George 27.05.2019 18:52

В этом случае вы можете просто определить порядок своих проверок, чтобы AOIO проверялся перед AOI?

Blorgbeard 27.05.2019 18:54

Это хороший момент, мне нужно найти очень похожие и сделать это. Если вы опубликуете такой ответ, я проголосую за правильный ответ. Спасибо!

George 27.05.2019 18:55

В качестве альтернативы вы можете использовать регулярное выражение для извлечения «всех букв между началом и первым числом» с чем-то вроде ^([A-Z]*)[0-9]

Blorgbeard 27.05.2019 18:55

Мне больше нравится это решение, тогда я могу провести прямое сравнение. Кроме того, это может помочь с извлечением других вещей, таких как «от первого числа до последнего числа перед буквой».

George 27.05.2019 18:57
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
8
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Самый простой способ проверить наличие префикса — просто string.startswith().

Если у вас есть префиксы, которые являются префиксами других префиксов (например, AOIO и AOI), вам просто нужно быть осторожным, чтобы определить порядок ваших проверок, чтобы сначала проверялись более длинные префиксы.

Кроме того, вы можете использовать регулярное выражение для извлечения префикса и другой необходимой информации. Пример:

^([A-Z]*)[0-9]+D([0-9]+)

Это даст вам два групповых захвата, первый из которых будет префиксом, а второй — числом после D. Подробнее см. здесь: https://regex101.com/r/GxSZSI/2

Пример использования в Python:

>>> import re
>>> s = 'GOE22D2OKDLALKCDSI'
>>> m = re.match('^([A-Z]*)[0-9]+D([0-9]+)', s)
>>> m.groups()
('GOE', '2')

Другие вопросы по теме