如何创建一个匹配所有字母数字的正则表达式,而不是一开头的数字?
现在我有"^[0-9][a-zA-Z0-9_]"
例如,1ab不匹配,ab1匹配,1_bc不匹配,bc_1匹配。
答案 0 :(得分:5)
你写的东西有三个错误。
首先,为了否定一个字符类,你将^
放在括号内,而不是它们之前。 ^[0-9]
表示"字符串开头的任何数字&#34 ;; [^0-9]
表示"除数字之外的任何内容"。
其次,[^0-9]
将匹配任何不是数字的,而不仅仅是字母和下划线。你真的想说第一个字符"不是数字,而是数字,字母或下划线",对吧?虽然它不可能这样说,但将它合并到"是一个字母或下划线"更容易。
此外,您忘记重复上一个字符集。原样,您恰好匹配两个字符,因此b1
可以使用,但b12
不会。
所以:
[a-zA-Z_][a-zA-Z0-9_]*
换句话说:一个字母或下划线,后跟零个或多个字母,数字或下划线。
我不完全确定这是你真正想要的,至少如果正则表达式是你的整个解析器。例如,在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 强>
正则表达式的想法是
^[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 !