首页 > 解决方案 > 带有特殊字符“^”的文件名无法被 pattern.match 识别(RegEx 函数)

问题描述

我在 Winows 10 上使用 Python 3.6.5。

我无法验证目录中是否存在文件。问题似乎来自特殊字符“^”。

当我运行下面的代码时,os.listdir () 函数很好地列出了“WITHOUT_CIRCUMFLEX”和“^WITH_CIRCUMFLEX”文件。但是,文件“^ WITH_CIRCUMFLEX”不能被函数pattern.match(文件)识别......虽然它存在!

有人有解决这个问题的想法吗?谢谢你的帮助

# 编码:utf-8

将熊猫导入为 pd 导入 os.path 导入正则表达式 路径 = "C:\Users\David\test" list_name = ['WITHOUT_CIRCUMFLEX', '^WITH_CIRCUMFLEX']

df_empty = pd.DataFrame()

对于 list_name 中的名称: df_empty.to_pickle('{path}\{name}.pkl'.format(**locals())) 模式 = regex.compile('{name}.pkl'.format(**locals()))

# 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")

标签: pythonregexutf-8

解决方案


^是一个正则表达式元字符,因此它不会匹配文本中的文字^字符。您需要转义这些字符:

'\^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 模块会更好:

import glob

for name in list_name:
    ...
    escaped_name = glob.escape(name)
    files = glob.glob('*{}.pkl'.format(escaped_name))

推荐阅读