如何使用 Python 将任何字符串转换为有效的自定义模式?

Posted

技术标签:

【中文标题】如何使用 Python 将任何字符串转换为有效的自定义模式?【英文标题】:How to convert any string into a valid custom pattern using Python? 【发布时间】:2017-06-17 03:15:18 【问题描述】:

我希望我的字符串只有字母数字字符、- 和下划线。而已。我正在尝试编写一个接收用户输入字符串并将其转换为遵循指南的方法。

我的正则表达式显然是a-zA-Z0-9_-。我想要做的是用 - 替换所有空格,并删除所有其他不属于我的正则表达式的字符。

因此,字符串'Hello, world!' 将被转换为'Hello-world'。特殊字符被删除,空格被替换为 -。

使用 python 最有效的方法是什么?我是否必须逐个字符地遍历整个字符串,还是有更好的方法?谢谢!

【问题讨论】:

您的输出是否包含数字?它们是字母数字,但您的正则表达式失败 大写转小写是故意的吗? 难道你需要这个来形成标题的 url? @PatrickHaugh 没有数字,只有 A 到 Z(大写和小写,破折号 (-) 和下划线 (_) 都允许。我之前犯了一个错误。现在已修复。 @ppasler 是的,这是一个 URL。 【参考方案1】:

在为内容生成 URL 名称时,也经常使用您想要的。它在django.utils.text.slugify 中实现。 slugify 函数转换为小写。 这是保留大小写的 Django slugify 函数的简化版本:

import re
def slugify(value):
    value = re.sub('[^A-Za-z_\s-]', '', value, flags=re.U).strip()
    return re.sub('[-\s]+', '-', value, flags=re.U)
print(slugify("Hello World!"))
# Hello-World

【讨论】:

【参考方案2】:

你可以用两个subs来做到这一点:1)用-替换空格; 2)删除其他不需要的字符:

s = 'Hello, world!'

import re
re.sub("[^a-zA-Z_-]", "", re.sub("\s+", "-", s))
# 'Hello-world'

如果你想在你的字符串中保留数字:

re.sub("[^a-zA-Z0-9_-]", "", re.sub("\s+", "-", s))
# 'Hello-world'

这里[^a-zA-Z_-]匹配单个字符不是字母(大写和小写)、下划线和破折号,破折号需要放在字符类[]的末尾,这样就不会被视为范围但文字。

【讨论】:

以上是关于如何使用 Python 将任何字符串转换为有效的自定义模式?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 中将字符串转换为有效的变量名?

如何调试并进入转换为 C++ 的自定义语言源?

有效地将字符串转换为 python 2.7 的 unicode

QVariant 中的自定义类型转换为空字符串

Scss中的自定义函数

如何将 Python 3 字节字符串变量转换为常规字符串? [复制]