字母、破折号、下划线、数字和空格的正则表达式

3

This is my attempt

def matcher(ex):
    if re.match(r'^[\w|\d][A-Za-z0-9_-]+$', ex):
        print 'yes'

我的目标是只匹配符合以下所有条件的提交

  1. 以字母或数字开头,且
  2. 只允许字母、空格、破折号、下划线和数字
  3. 去除所有结尾空格

在我的正则表达式中,matcher('__') 被认为是有效的。如何修改才能实现我真正想要的?我相信 \w 也包括下划线。但是 matcher('_') 没有匹配上...


\w 表示 [0-9A-Za-z_],而你的正则表达式断言至少有 2 个字符。 - nhahtdh
1个回答

12
def matcher(ex):
    ex = ex.rstrip()
    if re.match(r'^[a-zA-Z0-9][ A-Za-z0-9_-]*$', ex):
        print 'yes'

你原来的正则表达式存在以下问题:

  1. | 并不意味着字符类中的备选项,它只是代表一个管道符。

  2. 你在后面的字符中使用了 +,表示匹配一个或多个,因此像 '_' 这样的单字符字符串将无法匹配。

  3. 你在第一个字符中使用了 \w,这会接受下划线字符。


你的第二个从句需要一个空格。 - Hugh Bothwell
另外,要去除末尾的空格,只需使用 mystring.rstrip() 而不是正则表达式。 - mathematical.coffee
@Ned Batchelder 这很棒。但是为什么在这个上下文中 | 不表示 呢?谢谢。 - user1012451
@user1012451:正则表达式语法表示字符类的工作方式。[]内唯一的特殊字符是前导的^,表示“不是这些字符”,以及中间的-,表示一系列字符。 - Ned Batchelder
@NedBatchelder和其他所有人,谢谢!我学到了新东西 :) - user1012451

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接