如何在开头创建一个匹配所有字母数字而没有数字的正则表达式?
现在我有"^[0-9][a-zA-Z0-9_]"
例如,1ab不匹配,ab1匹配,1_bc不匹配,bc_1匹配。
你写的东西有三个错误。
首先,为了否定一个字符类,你将^
放在括号内,而不是在它们之前。 ^[0-9]
的意思是“任何数字,在字符串的开头”; [^0-9]
的意思是“除了数字之外的任何东西”。
其次,[^0-9]
将匹配任何不是数字的东西,而不仅仅是字母和下划线。你真的想说第一个字符“不是数字,而是数字,字母或下划线”,对吧?虽然不可能这么说,但将它合并为“是一个字母或下划线”要容易得多。
此外,您忘了重复最后一个字符集。原样,你只匹配两个字符,所以b1
会工作,但b12
不会。
所以:
[a-zA-Z_][a-zA-Z0-9_]*
换句话说:一个字母或下划线,后跟零个或多个字母,数字或下划线。
我不完全确定这是你真正想要的,至少如果正则表达式是你的整个解析器。例如,在foo-bar
,你想让bar
匹配吗?如果是这样,在123spam
,你想让spam
得到匹配吗?但这就是你想写的东西。
这应该这样做:
^[^0-9][a-zA-Z0-9_]+$
阐释:
^
:匹配除了数字之外的任何东西[^0-9]
:匹配一个或多个字母数字字符[a-zA-Z0-9_]+
:匹配线的末尾另一个建议,试试这个:
$
您可以使用此代码迭代结果:
\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()
^[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_])
for insensitive和i
for multiline。
您可以使用的python代码是:
m
你可以使用这个: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)
这是正确的答案。
^[A-Za-z_][A-Za-z0-9_]*$
如果该行不以数字开头,则匹配整个部分。
而这一个也是另一个模式做类似的工作:
^(?!^[0-9].*$).*