Регулярное выражение Python, сопоставляющее все, кроме последнего случая

Итак, у меня есть выражение, такое как. /folder/thisisa.test/file.cxx.h. Как заменить/удалить все ".". но последняя точка?

Ответ 1

Чтобы совместить все, кроме последней точки, с регулярным выражением:

'\.(?=[^.]*\.)'

Используя lookahead, чтобы проверить, есть ли еще одна точка после найденной (lookahead не является частью совпадения).

Ответ 2

Без регулярных выражений, используя str.count и str.replace:

s = "./folder/thisisa.test/file.cxx.h" 
s.replace('.', '', s.count('.')-1)
# '/folder/thisisatest/filecxx.h'

Ответ 3

Специальное решение с одним символом

В вашем текущем сценарии вы можете использовать

text = re.sub(r'\.(?![^.]*$)', '', text)

Здесь \.(?![^.]*$) сопоставляет .\.), за которым не следует сразу ((?!...)), с любыми символами 0+, кроме . (см. [^.]*), до конца строки ($).

См. демонстрацию регулярных выражений и демонстрацию Python.

Общее решение для символов 1+

В случае, если вы хотите заменить . и другими символами, вы можете использовать группу захвата вокруг класса символов с символами, которые вам нужно сопоставить, и добавить положительный "lookahead" с .* и обратная ссылка на захваченное значение.

Скажем, вам нужно удалить последнее вхождение [, ], ^, \, /, - или ., которые вы можете использовать

([][^\\./-])(?=.*\1)

См. демонстрационную версию регулярных выражений.

Подробнее

  • ([][^\\./-]) - группа захвата, соответствующая ], [, ^, \, ., /, - (обратите внимание, что порядок этих символов важен: - должен быть в конце ] должен быть в начале, ^ не должен быть в начале и \ должен быть экранирован)
  • (?=.*\1) - положительный прогноз, требующий как можно большего числа символов 0+, а затем значения, полученного в группе 1.

Пример кода Python:

import re
text = r"./[\folder]/this-is-a.test/fi^le.cxx.LAST[]^\/-.h"
text = re.sub(r'([][^\\./-])(?=.*\1)', '', text, flags=re.S)
print(text)

Помните префикс r со строковыми литералами. Обратите внимание, что flags=re.S заставит . соответствовать любым последовательностям разрывов строк.