正则表达式不是以数字开头的

时间:2014-10-27 20:30:43

标签: python regex

如何创建一个匹配所有字母数字的正则表达式,而不是一开头的数字?

现在我有"^[0-9][a-zA-Z0-9_]"

例如,1ab不匹配,ab1匹配,1_bc不匹配,bc_1匹配。

7 个答案:

答案 0 :(得分:5)

你写的东西有三个错误。

首先,为了否定一个字符类,你将^ 放在括号内,而不是它们之前。 ^[0-9]表示"字符串开头的任何数字&#34 ;; [^0-9]表示"除数字之外的任何内容"。

其次,[^0-9]将匹配任何不是数字的,而不仅仅是字母和下划线。你真的想说第一个字符"不是数字,而是数字,字母或下划线",对吧?虽然它不可能这样说,但将它合并到"是一个字母或下划线"更容易。

此外,您忘记重复上一个字符集。原样,您恰好匹配两个字符,因此b1可以使用,但b12不会。

所以:

[a-zA-Z_][a-zA-Z0-9_]*

Regular expression visualization

Debuggex Demo

换句话说:一个字母或下划线,后跟零个或多个字母,数字或下划线。

我不完全确定这是你真正想要的,至少如果正则表达式是你的整个解析器。例如,在foo-bar中,您希望bar匹配吗?如果是这样,在123spam中,您希望spam匹配吗?但这是你想写的东西。

答案 1 :(得分:1)

这应该这样做:

^[^0-9][a-zA-Z0-9_]+$

阐释:

  • ^:匹配行开头
  • [^0-9]:匹配除数字
  • 之外的任何内容
  • [a-zA-Z0-9_]+:匹配一个或多个字母数字字符
  • $:匹配行尾

答案 2 :(得分:0)

您可以使用:^[A-Za-z_][A-Za-z0-9_]*$

答案 3 :(得分:0)

另一个建议,试试这个:

\b([a-zA-Z][^\s]*)

您可以使用此代码迭代结果:

reobj = re.compile(r"\b([a-zA-Z][^\s]*)")
for match in reobj.finditer(subject):
    start = match.start()
    end = match.end()
    text = match.group()

答案 4 :(得分:0)

您可以使用此正则表达式:

^[a-z]\w+$

<强> Working demo

enter image description here

正则表达式的想法是

^[a-z]   -> Have to start with a letter
\w+$     -> can contain multiple alphanumeric characters (\w is the shortcut for [A-Za-z_])

请记住正则表达式标记i表示不敏感,而m表示多行。

您可以使用的python代码是:

import re
p = re.compile(ur'^[a-z]\w+$', re.MULTILINE | re.IGNORECASE)
test_str = u"would match\nab1\nbc_1\n\nwould not match\n1_bc\n1ab"

re.findall(p, test_str)

答案 5 :(得分:0)

这是正确的答案。

^(?!^[0-9].*$).*

如果行不是以数字开头,则匹配整个部分。

这也是另一种模式,其工作类似:

^[^0-9]+.*

答案 6 :(得分:0)

您可以将 \D 用于任何非数字

/^\D[a-zA-Z0-9_]+$/ Should work !