Python regex替换除小写字母、数字字符、下划线和破折号以外的所有字符

Python regex替换除小写字母、数字字符、下划线和破折号以外的所有字符,python,regex,Python,Regex,我有一个函数,它将字符串作为输入,并替换任何不是字母、数字、下划线或破折号的内容: def清洁标签值(标签值): """ GCP标签值必须遵循严格的指导原则 键和值只能包含小写字母、数字字符、下划线、, 和破折号。允许使用国际字符。 https://cloud.google.com/compute/docs/labeling-resources#restrictions :param label_value:需要清理的标签值 :返回:已清除的标签值 """ 完整模式=重新编译(“[^a-zA-Z

我有一个函数,它将字符串作为输入,并替换任何不是字母、数字、下划线或破折号的内容:

def清洁标签值(标签值):
"""
GCP标签值必须遵循严格的指导原则
键和值只能包含小写字母、数字字符、下划线、,
和破折号。允许使用国际字符。
https://cloud.google.com/compute/docs/labeling-resources#restrictions
:param label_value:需要清理的标签值
:返回:已清除的标签值
"""
完整模式=重新编译(“[^a-zA-Z0-9]”)
返回re.sub(完整模式,''''''u',标签值).lower()
我有一个单元测试,它成功了

def测试清洁标签值(自身):
self.assertEqual(干净的标签值('XYZ:.\\/,'),'XYZ\\\\\\\\')
然而,它取代了破折号,我不希望它这样做。证明:

def清洁标签值(标签值):
完整模式=重新编译(“[^a-zA-Z0-9]|-”)
返回re.sub(完整模式,''''''u',标签值).lower()
但这是:

def测试清洁标签值(自身):
self.assertEqual(clean_label_value('XYZ-'),'XYZ-'))
然后以失败告终

xyz-!=xyz_

预期:xyz_uz
实际值:xyz-


换句话说,
-
正被一个
.
所取代。我不想那样。我一直在摆弄正则表达式,尝试各种不同的组合,但我想不出那该死的东西。有人吗?

将一个
-
放在集合的开头或结尾(字符类)。然后它不创建字符范围,而是表示文字
-
字符本身

re.compile('[^-a-zA-Z0-9]')
还可以使用
\
转义
-
,以指示它是一个文字破折号字符,而不是集合中的范围运算符

re.compile(r'[^\-\w]')

特殊序列
\w
相当于集合
[a-zA-Z0-9
(“w”表示“单词字符”)。

在集合(字符类)的最开头或结尾放置一个
-
。然后它不创建字符范围,而是表示文字
-
字符本身

re.compile('[^-a-zA-Z0-9]')
还可以使用
\
转义
-
,以指示它是一个文字破折号字符,而不是集合中的范围运算符

re.compile(r'[^\-\w]')
特殊序列
\w
相当于集合
[a-zA-Z0-9\
(“w”表示“单词字符”)