Моя строка выглядит так:
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'
Технически вам не нужно регулярное выражение (например, вы можете использовать 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)
использование
(bo_\d+$)(?![\s\S]*^\1$)
Поскольку вы хотите включить bo_10
, вы должны использовать \d+
а не только \d
в начальной группе. Затем, в своем негативном взгляде, поставьте backrefrence между якорями начала и конца строки, так что, например, bo_1
не исключается, потому что за ним следует bo_10
.