引用列表来删除字符串值

问题描述 投票:0回答:2

以下

def clean_sheet_title
函数引用
INVALID_TITLE_CHAR
INVALID_TITLE_CHAR_MAP
去除无效字符并将
title
限制为 31 个字符 -

# This strips characters that are invalid to Excel
INVALID_TITLE_CHARS = ["]", "[", "*", ":", "?", "/", "\\", "'"]
INVALID_TITLE_CHAR_MAP = {ord(x): "" for x in INVALID_TITLE_CHARS}

# How would I remove strings, as well as the characters from INVALID_TITLE_CHARS?
INVALID_TITLE_NAMES = ["zz_ FeeRelationship", " Family"]

def clean_sheet_title(title):
    title = title or ""
    title = title.strip()
    title = title.translate(INVALID_TITLE_CHAR_MAP)
    return title[:31]

我的问题是如何扩展它以从

INVALID_TITLE_NAMES
列表中删除字符串?

我尝试过的:我尝试对

def clean_sheet_title
进行以下更新,但这对
title
-

没有任何影响
INVALID_TITLE_CHARS = ["]", "[", "*", ":", "?", "/", "\\", "'"]
INVALID_TITLE_CHAR_MAP = {ord(x): "" for x in INVALID_TITLE_CHARS}

INVALID_TITLE_NAMES = ["zz_ FeeRelationship", "Family"]


def clean_sheet_title(title):
    title = title or ""
    title = title.strip()
    title = title.translate(INVALID_TITLE_CHAR_MAP, "")
    for name in INVALID_TITLE_NAMES:
        title = title.replace(name, "")
    return title[:31]

示例:

  • 当前功能能力 - 如果

    title
    ==
    Courtenay:Family
    那么当前
    def clean_sheet_title
    将确保标题为
    Courtenay Family

  • 所需的功能 - 有时

    title
    可以使用
    zz_ FeeRelationship
    Family
    作为前缀或后缀,在这两种情况下,都应删除这些字符串。例如。
    zz_ FeeRelationship Courtenay:Family
    会变成
    Courtenay

python replace ord
2个回答
0
投票

试试这个:

for name in INVALID_TITLE_NAMES:
    title = title.replace(name, "")

这是您想要达到的结果吗?它应该用空字符串替换

title
中的每个无效名称。


0
投票

您可以使用正则表达式来匹配任何关键字或字符,并将其替换为空字符串:

import re

INVALID_TITLE_CHARS = ["]", "[", "*", ":", "?", "/", "\\", "'"]
INVALID_TITLE_NAMES = ["zz_ FeeRelationship", " Family"]

inv_char_grp = re.escape("".join(INVALID_TITLE_CHARS))
inv_name_grp = "|".join(re.escape(name) for name in INVALID_TITLE_NAMES)


regex = f"[{inv_char_grp}]|{inv_name_grp}"


title = "zz_ FeeRelationship Courtenay: Family"
result = re.sub(regex, "", title)
print(result)

打印

Courtenay


正则表达式解释:

  • 由于
    INVALID_TITLE_CHARS
    中有特殊字符,因此需要对它们进行转义,以便正则表达式引擎将它们识别为 literal 字符,而不是使用其特殊含义。因此,我们连接
    INVALID_TITLE_CHARS
    中的所有字符,然后使用
    re.escape
    对结果字符串进行转义。这给了我们正则表达式
    inv_char_grp = r"\]\[\*:\?/\\'"
  • 我们将其包装在
    [
    ]
    中以表示我们想要使用 `f"[{inv_char_grp}]" 匹配 其中任何一个字符
  • 我们还想匹配
    INVALID_TITLE_NAMES
    中的任何名称。由于这些是整个字符串,因此我们不会为它们使用字符组。相反,我们可以使用
    |
    运算符来指示我们想要匹配其任何操作数。另请记住对名称进行转义,以防名称包含任何特殊字符。

我们得到的最终正则表达式是

[\]\[\*:\?/\\']|zz_\ FeeRelationship|\ Family

[\]\[\*:\?/\\']                                : Any of these chars ][*:?/\
               |                               : Or
                zz_\ FeeRelationship           : Exactly zz_, then a space, then FeeRelationship
                                    |          : Or
                                     \ Family  : Exactly one space, then Family

在线尝试

© www.soinside.com 2019 - 2024. All rights reserved.