Python 如何检查字符串是否仅包含字母数字字符和破折号?

Python 如何检查字符串是否仅包含字母数字字符和破折号?,python,regex,string,alphanumeric,Python,Regex,String,Alphanumeric,我正在测试的字符串可以与[\w-]+匹配。我是否可以在Python中测试字符串是否符合此要求,而不是使用不允许的字符列表并进行测试?如果要根据正则表达式测试字符串,请使用库 Python也有正则表达式: import re if re.match('^[\w-]+$', s): ... 或者,您可以创建一个允许的字符列表: from string import ascii_letters if all(c in ascii_letters+'-' for c in s): ..

我正在测试的字符串可以与
[\w-]+
匹配。我是否可以在Python中测试字符串是否符合此要求,而不是使用不允许的字符列表并进行测试?

如果要根据正则表达式测试字符串,请使用库


Python也有正则表达式:

import re
if re.match('^[\w-]+$', s):
    ...
或者,您可以创建一个允许的字符列表:

from string import ascii_letters
if all(c in ascii_letters+'-' for c in s):
    ...

为了测试字符串是否只包含字母数字和破折号,我将使用

import re
found_s = re.findall('^[\w-]+$', s)
valid = bool(found_s) and found_s[0] == s

在不使用纯python导入任何模块的情况下,删除除破折号以外的任何非字母、数字模块

string = '#Remove-*crap?-from-this-STRING-123$%'

filter_char = lambda char: char.isalnum() or char == '-'
filter(filter_char, string)

# This returns--> 'Remove-crap-from-this-STRING-123'
或者在一行中:

''.join([c for c in string if c.isalnum() or c in ['-']])

没有区域设置指示,字母数字字符仅匹配
[a-zA-Z0-9]+
,而不是
[\w]+
。重新匹配(“^[\w-]+$”,s)返回相应的MatchObject实例。如果字符串与模式不匹配,则返回None。应该与无相比较。@nor为什么?任何匹配对象都是真实的,None是唯一可能的falsy值。这应该是可接受的答案,您不需要正则表达式或外部包来解决此问题。完全同意
''.join([c for c in string if c.isalnum() or c in ['-']])