Python - Regex, чтобы избежать совпадения дубликатов

1

Моя строка выглядит так:

bo_1
bo_1
bo_2
bo_2
bo_3
bo_3
bo_4
bo_4
bo_5
bo_5
bo_6
bo_6
bo_7
bo_7
bo_8
bo_8
bo_9
bo_9
bo_10
bo_10

Я хочу совместить первый экземпляр каждой цифры и игнорировать следующую повторяющуюся строку. Мое регулярное выражение выглядит следующим образом:

(bo_\d)(?![\s\S]*\1)

который возвращает следующее:

'bo_2'
'bo_3'
'bo_4'
'bo_5'
'bo_6'
'bo_7'
'bo_8'
'bo_9'
'bo_1'

Как я могу изменить регулярное выражение, чтобы вместо этого вернуть результат (включить "bo_1" в начале и "bo_10" в конце):

'bo_1'
'bo_2'
'bo_3'
'bo_4'
'bo_5'
'bo_6'
'bo_7'
'bo_8'
'bo_9'
'bo_10'
Теги:

2 ответа

1

Технически вам не нужно регулярное выражение (например, вы можете использовать set()):

>>> # Assume your string is in the variable called "text"
>>> result = set(text.split('\n'))
>>> result
{'bo_7', 'bo_3', 'bo_1', 'bo_6', 'bo_5', 'bo_8', 'bo_9', 'bo_2', 'bo_4', 'bo_10'}

В любом случае проблема с вашим регулярным выражением заключается в том, что bo_1 также соответствует bo_10, поэтому он будет рассматриваться как дубликат регулярным выражением. Вы можете решить это, используя границы слов, чтобы убедиться, что полное "слово" проверено на соответствие:

\b(bo_\d+)\b(?![\s\S]*\b\1\b)

regex101 demo

0

использование

(bo_\d+$)(?![\s\S]*^\1$)

Поскольку вы хотите включить bo_10, вы должны использовать \d+ а не только \d в начальной группе. Затем, в своем негативном взгляде, поставьте backrefrence между якорями начала и конца строки, так что, например, bo_1 не исключается, потому что за ним следует bo_10.

https://regex101.com/r/8khbcc/1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню