Разделить с помощью регулярных выражений в Python - PullRequest
0 голосов
/ 10 января 2019

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

SVC_DC = 'JHN097567898_01102019_050514_svc_dc.tar"

Мое решение:

import regex as re
ans=re.split(os.sep,SVC_DC)

Ошибка: re.error: bad escape (end of pattern) at position 0

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Причиной вашей ошибки являются подробности, касающиеся регулярных выражений, а именно вопрос цитаты.

например. под Windows os.sep = '\\', то есть одиночный обратный слеш.

Но обратная косая черта в регулярных выражениях имеет особое значение, просто для экранирования специальных символов, поэтому, чтобы использовать его буквально , вы должны написать дважды .

Попробуйте следующий код:

import re
import os

SVC_DC = 'JHN097567898_01102019_050514_svc_dc.tar'
print(re.split(os.sep * 2, SVC_DC))

Результат:

['JHN097567898_01102019_050514_svc_dc.tar']

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

Редактировать

Чтобы заставить регулярное выражение работать под и Windows и Unix, вы можете попробовать:

print(re.split('\\' + os.sep, SVC_DC))

Обратите внимание, что это регулярное выражение содержит:

  • a жестко закодированная обратная косая черта в качестве escape-символа,
  • разделитель пути, используемый в текущей операционной системе.

Обратите внимание, что косая черта forward (в случае Unix) не требует цитирования, но использование цитаты здесь все еще приемлемо (не нужно, но работает).

0 голосов
/ 10 января 2019

Если вы хотите имя файла, регулярные выражения не ваш ответ.

В Python есть модуль pathlib , предназначенный для обработки путей к файлам, и его объекты, помимо методов, позволяющих получить изолированное имя файла для подбора всех возможных угловых случаев, также есть методы для открытия, вывода списка файлов и выполнения всех действий. каждый обычно делает с файлом.

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

In [1]: import pathlib

In [2]: name = pathlib.Path("/home/user/JHN097567898_01102019_050514_svc_dc.tar")

In [3]: name.name
Out[3]: 'JHN097567898_01102019_050514_svc_dc.tar'

In [4]: name.parent
Out[4]: PosixPath('/home/user')

В противном случае, даже если вы не будете использовать pathlib, где os.path.sep будет одним символом, не будет никакого преимущества в использовании re.split вообще - нормальный string.split сделает. На самом деле, существует также os.path.split, который, предшествующий pathlib, всегда делал бы то же самое:

In [6]: name = "/home/user/JHN097567898_01102019_050514_svc_dc.tar"

In [7]: import os

In [8]: os.path.split(name)[-1]
Out[8]: 'JHN097567898_01102019_050514_svc_dc.tar'

И, наконец (и в данном случае, по крайней мере, на самом деле), причина ошибки заключается в том, что вы находитесь в Windows, и ваш символ os.path.sep равен "\" - один этот символ не является полным регулярным выражением, так как Движок regex ожидает символ, указывающий на специальную последовательность после «\». Чтобы он использовался без нашей ошибки, вам нужно сделать:

 re.split(re.escape(os.path.sep), "myfilepath")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...