【发布时间】:2011-06-11 00:21:38
【问题描述】:
我正在寻找匹配从网站输入的字符串以检查是否是字母数字并可能包含下划线。 我的代码:
if re.match('[a-zA-Z0-9_]',playerName):
# do stuff
由于某种原因,这与疯狂的字符匹配,例如:nIg○▲ ☆ ★ ◇ ◆
我只想要常规的 A-Z 和 0-9 和 _ 匹配,这里有什么我缺少的吗?
【问题讨论】:
我正在寻找匹配从网站输入的字符串以检查是否是字母数字并可能包含下划线。 我的代码:
if re.match('[a-zA-Z0-9_]',playerName):
# do stuff
由于某种原因,这与疯狂的字符匹配,例如:nIg○▲ ☆ ★ ◇ ◆
我只想要常规的 A-Z 和 0-9 和 _ 匹配,这里有什么我缺少的吗?
【问题讨论】:
当未指定 LOCALE 和 UNICODE 标志时,Python 有一个特殊的序列 \w 用于匹配字母数字和下划线。所以你可以修改你的模式,
pattern = '^\w+$'
【讨论】:
您的正则表达式只匹配一个字符。试试这个:
if re.match('^[a-zA-Z0-9_]+$',playerName):
【讨论】:
…检查是否是字母数字并可能包含下划线。
你的意思是字面意思,所以总共只允许一个下划线? (玩家名称并非不合理;尤其是相邻的下划线可能很难让其他玩家阅读。)“a_b_c”是否应该不匹配?
如果是这样:
if playerName and re.match("^[a-zA-Z0-9]*_?[a-zA-Z0-9]*$", playerName):
条件的新第一部分检查空值,这简化了正则表达式。
这对下划线的出现位置没有限制,因此所有“_a”、“a_”和“_”都将匹配。如果您希望同时避免前导下划线和尾随下划线(这对于玩家名称来说也是合理的),请更改为:
if re.match("^[a-zA-Z0-9]+(?:_[a-zA-Z0-9]+)?$", playerName):
// this regex doesn't match an empty string, so that check is unneeded
【讨论】: