Итак, у меня есть выражение, такое как. /folder/thisisa.test/file.cxx.h. Как заменить/удалить все ".". но последняя точка?
Регулярное выражение Python, сопоставляющее все, кроме последнего случая
Ответ 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.
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
заставит .
соответствовать любым последовательностям разрывов строк.