Python 匹配数字和字符串的正则表达式

Python 匹配数字和字符串的正则表达式,python,regex,Python,Regex,我有下面给出的一系列单词 476pe e586 9999 rrr ABCF ^[\D]*[0-9]+[\D]*$ 我必须编写一个正则表达式,将数字和数字与字母匹配。从上面的字符串中,我只需匹配 476pe e586 9999 我试着写一个正则表达式,如下所示 476pe e586 9999 rrr ABCF ^[\D]*[0-9]+[\D]*$ 但它不起作用。我用一个在线正则表达式工具尝试了这一点,它显示整个字符串都是匹配的。正则表达式的问题是\D可以是数字以外的任何东西,因此它会错误

我有下面给出的一系列单词

476pe
e586
9999
rrr
ABCF
^[\D]*[0-9]+[\D]*$

我必须编写一个正则表达式,将数字和数字与字母匹配。从上面的字符串中,我只需匹配

476pe
e586
9999
我试着写一个正则表达式,如下所示

476pe
e586
9999
rrr
ABCF
^[\D]*[0-9]+[\D]*$

但它不起作用。我用一个在线正则表达式工具尝试了这一点,它显示整个字符串都是匹配的。

正则表达式的问题是\D可以是数字以外的任何东西,因此它会错误地将字符串与该位置的特殊字符匹配,并且无法将字符串与多组数字匹配

相反,可以尝试类似^[0-9a-zA-Z]*[0-9][0-9a-zA-Z]*$的方法。这将匹配任意数量的数字或字母,后跟一个数字,然后再匹配任意数量的数字或字母

如果您只是检查匹配项,这里有一个…

\d就够了

或者使用以下命令:

[^a-zA-Z\n]
这将匹配前三个单词,但不匹配那些只有字母的单词


此处演示:

最简单的表达式是

[0-9]
这将匹配至少包含一个数字的每个字符串。

您可能需要它

^(\D*\d+\D*)+$
小心\D相当于[^0-9]。

请尝试以下方法:

(?im)^[a-z0-9]+$
例如:

演示:


既然其他答案给出了很多解决你问题的方法,让我试着解释一下你的行为

首先,特定于Ruby的正则表达式语义。我没有关于Ruby和Python的正则表达式引擎之间有什么不同的确切信息。由于已标记,因此可能需要使用或。我将用这两个来解释

现在,让我们看看实际的正则表达式和数据。您的输入字符串如下所示

476dn
e586
9999
rrr
ABCF
regex = re.compile(r"^[\D]*[0-9]+[\D]*$", re.MULTILINE)
print regex.findall(data)
# ['476pe', 'e586', '9999\nrrr\nABCF']
regex = re.compile(r"^[0-9a-zA-Z]*[0-9][0-9a-zA-Z]*$", re.MULTILINE)
print regex.findall(data)
# ['476pe', 'e586', '9999']
正则表达式可以通过两种方式查看输入。包含换行符的长字符串或由换行符分隔的字符串列表。我们可以使用RegEx标志来控制这种行为,它在Python中被称为multiline标志。引用Python文档

re.M 关于多行 指定时,模式字符“^”在字符串开头和紧跟在换行之后的每行开头匹配;并且模式字符“$”在字符串的末尾和紧靠每一换行之前的每一行的末尾匹配。默认情况下,“^”仅在字符串的开头匹配,而“$”仅在字符串的结尾和紧靠换行符之前匹配(如果有)

例如,在我们的示例中,如果未启用此标志,则输入字符串将被视为包含换行符的长字符串,^将匹配第一行中4之前的位置,$将匹配最后一行中F之后的位置

启用该标志后,^和$将分别匹配第一个和最后一个字符前后的相应位置。因此,它们可以匹配以下内容

当^是4之前的位置时,$将是n之后的位置 ^是4之前的位置时,$将是6之后的位置 ^是4之前的位置时,$将是9之后的位置 当^是4之前的位置时,$将是r之后的位置 当^是4之前的位置时,$将是f之后的位置 当^是e之前的位置时,$将是6之后的位置 当^是e之前的位置时,$将是9之后的位置 当^是e之前的位置时,$将是r之后的位置 当^是e之前的位置时,$将是f之后的位置 当^是9之前的位置时,$将是9之后的位置 当^是9之前的位置时,$将是r之后的位置 当^是9之前的位置时,$将是f之后的位置 当^是r之前的位置时,$将是r之后的位置 当^是r之前的位置时,$将是F之后的位置 当^是A前面的位置时,$将是F后面的位置 因为它可以匹配多个位置,所以我们必须明确指定正则表达式引擎,当我们使用多行字符串时,我们必须分别匹配每一行。在Python中,我们可以使用。在正则表达式世界中,它通常用标志g表示,即全局搜索

有了这个基本的理解,让我们再看看您的数据。我相信rubular已经默认启用了这两个功能。我们可以清楚地看到匹配,使用捕获组,如图所示,使用正则表达式

^([\D]*[0-9]+[\D]*)$
我们可以找到Python的匹配项,如下所示

476dn
e586
9999
rrr
ABCF
regex = re.compile(r"^[\D]*[0-9]+[\D]*$", re.MULTILINE)
print regex.findall(data)
# ['476pe', 'e586', '9999\nrrr\nABCF']
regex = re.compile(r"^[0-9a-zA-Z]*[0-9][0-9a-zA-Z]*$", re.MULTILINE)
print regex.findall(data)
# ['476pe', 'e586', '9999']
给定的模式与第一行和第二行匹配,它应该是平凡的。但第三场比赛一开始可能很难理解。当我们说^[\D]*时,表示0个或更多非数字字符。因此,空字符串也可以与[\D]*匹配。因此,在9999的开头,[\D]*匹配9999之前的空字符串,然后[0-9]+匹配数字9999,字符串的其余部分将由[\D]*匹配。它也与换行符匹配,因为\D除了一个数字以外的任何内容。因为,换行符不是一个数字,即使它也是一个数字 不匹配

还要注意\D还允许使用其他特殊字符。引用文件

未指定UNICODE标志时,匹配任何非数字字符;这相当于集合[^0-9]。使用UNICODE,它将匹配UNICODE字符属性数据库中标记为数字的字符以外的任何字符

所以,你可能想更明确一些,比如

这可以在Python中使用,如下所示

476dn
e586
9999
rrr
ABCF
regex = re.compile(r"^[\D]*[0-9]+[\D]*$", re.MULTILINE)
print regex.findall(data)
# ['476pe', 'e586', '9999\nrrr\nABCF']
regex = re.compile(r"^[0-9a-zA-Z]*[0-9][0-9a-zA-Z]*$", re.MULTILINE)
print regex.findall(data)
# ['476pe', 'e586', '9999']
或者,如果可以将字符串拆分为多个字符串,则可以执行以下操作

regex = re.compile(r"^[0-9a-zA-Z]*[0-9][0-9a-zA-Z]*$")
print [item for item in data.split() if regex.match(item)]
# ['476pe', 'e586', '9999']

如果您的目标是将任何只包含一个数字的字符串与任意数字进行匹配,则该正则表达式虽然不美观,但原则上应该可以工作。您如何使用它?换句话说,像12a34这样的字符串是否匹配?另外,你真的想匹配像/3这样的字符串吗!§您的正则表达式当前与哪些匹配?另外,您不希望它与哪些正则表达式匹配?你希望它匹配什么?Tim,我用一个在线正则表达式工具试着匹配,它显示所有字符串都匹配,但它不起作用。你这是什么意思?帮助我们帮助你。好答案,为什么你逃过了+?你甚至不需要+,如果你仔细看:这匹配没有数字的字符串,这不是OP想要的。@tobias_k…这将匹配数字和字母数字…从上面的字符串中,我只需匹配。。。数字和带字母的数字,但没有带数字的字母+1很好的解释。不确定这是否是故意的,但这与12abc34不匹配。@tobias_k你是对的,谢谢你指出这一点。编辑我的答案以使用您的正则表达式: