Имя файла со специальным символом «^», не распознаваемое pattern.match (функция RegEx) - PullRequest
0 голосов
/ 25 ноября 2018

Я работаю с Python 3.6.5 на Winows 10.

Я не могу проверить, существует ли файл в каталоге или нет.Кажется, проблема связана со специальным символом «^».

Когда я запускаю приведенный ниже код, файлы «WITHOUT_CIRCUMFLEX» и «^ WITH_CIRCUMFLEX» хорошо отображаются в списке функцией os.listdir ().Однако файл «^ WITH_CIRCUMFLEX» не распознается функцией pattern.match (file) ... пока он существует!

У кого-нибудь есть идеи для решения этой проблемы?Спасибо за вашу помощь

# coding: utf-8</p>

<p>import pandas as pd
import os.path
import regex
path = "C:\Users\David\test"
list_name = ['WITHOUT_CIRCUMFLEX', '^WITH_CIRCUMFLEX']</p>

<p>df_empty = pd.DataFrame()</p>

<p>for name in list_name:
    df_empty.to_pickle('{path}\{name}.pkl'.format(**locals()))
    pattern = regex.compile('{name}.pkl'.format(**locals()))</p>

<code># Check if file already exist
check = False
for file in os.listdir(path):
    print("I found this file\t" + file)
    if pattern.match(file):
        check = True

if check is True:
    print("\t" + name + " file exist" + "\n")
else:
    print("\t" + name + " does not exist")
</code>

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

^ является метасимволом регулярных выражений, поэтому вы должны избежать его.Самый простой способ сделать это - использовать функцию regex.escape, которая автоматически экранирует метасимволы в произвольной строке.

Поэтому вместо

pattern = regex.compile('{name}.pkl'.format(**locals()))

используйте

pattern = regex.compile(regex.escape('{name}.pkl').format(**locals()))
0 голосов
/ 25 ноября 2018

^ является метасимволом регулярного выражения, поэтому он не будет соответствовать буквальному символу ^ в тексте.Вам нужно экранировать таких символов:

'\^WITH_CIRCUMFLEX'

Если ваши входные данные генерируются или берутся из другого источника, используйте функцию regex.escape() для экранирования метасимволов:

for name in list_name:
    df_empty.to_pickle('{path}\{name}.pkl'.format(**locals()))
    name = regex.escape(name, special_only=True)
    pattern = regex.compile('{name}.pkl'.format(**locals()))

Однако, если вы ищете подходящие файлы, вы в настоящее время не используете ни одну из причин, по которой вы используете регулярное выражение.Ваш шаблон в лучшем случае будет соответствовать любому имени файла, оканчивающемуся на {name}.pkl.Вам было бы намного лучше, если бы вы использовали glob module :

import glob

for name in list_name:
    ...
    escaped_name = glob.escape(name)
    files = glob.glob('*{}.pkl'.format(escaped_name))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...