我正在使用python 2.7。如果我有一个字符串分配给名称变量,如下所示
name = "Test with-name and_underscore"
如何将其转换为可以分配给名称变量的字符串
name = "TestWithNameAndUnderscore"
正则表达式是否可行;或者python是否有任何构建函数来执行此操作....
所以我正在寻找的是,当一个字符串带有下划线或破折号或空格或其中的任何特殊字符时,它会被转换为相同的东西,但没有下划线/破折号/空格/特殊字符和首字母该单词的大写字母将以大写字母开头,所以就像“test name - is this_here”到“TestNameIsThisHere”。
如果没有空间或没有特殊的字符,那么就不要做任何事情。因此,如果字符串是“Helloworld”,则跳过它并继续前进。
我这样做的原因是,我正在使用python boto为AWS编写内容,并且对可以调用的资源有一个命名限制。它不能是非字母数字
答案 0 :(得分:2)
>>> import re
>>> name = "Test with-name and_underscore"
>>> print(''.join(x.capitalize() for x in re.compile(r'[^a-zA-Z0-9]').split(name)))
TestWithNameAndUnderscore
如果需要,您也可以删除前导数字。这是一个稍微更强大的示例,它将执行此操作并确保生成的字符串不为空:
>>> import re
>>> def fix_id(s, split=re.compile('[^a-zA-Z0-9]+|^[0-9]+').split):
... result = ''.join(x.capitalize() for x in split(s))
... if not result:
... raise ValueError('Invalid ID (empty after edits)')
... return result
...
>>> fix_id("Test with-name and_underscore")
'TestWithNameAndUnderscore'
>>> fix_id("123 Test 456 with-name and_underscore 789")
'Test456WithNameAndUnderscore789'
>>> fix_id("Thisshouldbeunmolested")
'Thisshouldbeunmolested'
>>> fix_id('123')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in fix_id
ValueError: Invalid ID (empty after edits)
请注意,这些都不能保证您的标识符的唯一性,例如: “Mary-Sue”和“mary sue”将映射到相同的标识符。如果您需要将这些标识符映射到不同的标识符,则可以添加缓存字典,在此处映射符号并在必要时添加后缀。
答案 1 :(得分:1)
这可以在没有Regex的情况下使用Python中的isalnum()函数来完成。
name = "Test with-name and_underscore"
new_name = ''.join(name for name in string if e.isalnum())
当然,如果你坚持使用正则表达式,那么通过用适当的正则表达式函数替换isalnum()也是可能的。
答案 2 :(得分:1)
我知道这是一种愚蠢的方法!
name.replace('_',' ').replace('-',' ')
name = name.title().replace(' ','')
答案 3 :(得分:0)
可能更小的重新方法是使用以下内容:
import re
string = '123 this is a test_of the-sub method 33'
varString = re.sub('_?-? ?', '', string)
它应该返回
>>> sub('_?-? ?','',string)
'123thisisatestofthesubmethod33'
如果您尝试将其用作变量名称,尽管您可能会遇到一些麻烦,例如太长时间(符合pep8)或其他外国字符,例如!?$%等....其中isalpha以上方法可能会有所帮助。我要小心我们相信字符串的值成为变量名并包装一些约束以避免任何类型的溢出。