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

问题描述 投票:2回答:6

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

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

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

python regex
6个回答
5
投票

你写的东西有三个错误。

首先,为了否定一个字符类,你将^放在括号内,而不是在它们之前。 ^[0-9]的意思是“任何数字,在字符串的开头”; [^0-9]的意思是“除了数字之外的任何东西”。

其次,[^0-9]将匹配任何不是数字的东西,而不仅仅是字母和下划线。你真的想说第一个字符“不是数字,而是数字,字母或下划线”,对吧?虽然不可能这么说,但将它合并为“是一个字母或下划线”要容易得多。

此外,您忘了重复最后一个字符集。原样,你只匹配两个字符,所以b1会工作,但b12不会。

所以:

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

Debuggex Demo

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

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


1
投票

这应该这样做:

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

阐释:

  • qazxsw poi:匹配线的开头
  • ^:匹配除了数字之外的任何东西
  • [^0-9]:匹配一个或多个字母数字字符
  • [a-zA-Z0-9_]+:匹配线的末尾

0
投票

另一个建议,试试这个:

$

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

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

0
投票

你可以使用这个正则表达式:

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

0
投票

你可以使用这个: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)


0
投票

这是正确的答案。

^[A-Za-z_][A-Za-z0-9_]*$

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

而这一个也是另一个模式做类似的工作:

^(?!^[0-9].*$).*
© www.soinside.com 2019 - 2024. All rights reserved.