以下
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
试试这个:
for name in INVALID_TITLE_NAMES:
title = title.replace(name, "")
这是您想要达到的结果吗?它应该用空字符串替换
title
中的每个无效名称。
您可以使用正则表达式来匹配任何关键字或字符,并将其替换为空字符串:
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