我有一系列的话,如下所示
476pe
e586
9999
rrr
ABCF
我必须编写一个正则表达式,将数字和数字与字母表匹配。从上面的字符串我必须只匹配
476pe
e586
9999
我试着编写一个正则表达式,如下所示
^[\D]*[0-9]+[\D]*$
但它不起作用。我使用在线正则表达式工具http://rubular.com/r/HQE2vG0pbu尝试了这一点,它显示整个字符串匹配。
答案 0 :(得分:3)
你的正则表达式的问题是\D
除了数字之外可以任何,所以它会错误地匹配那个位置有特殊字符的字符串,并且不能匹配超过一组数字。
相反,请尝试^[0-9a-zA-Z]*[0-9][0-9a-zA-Z]*$
之类的内容。这将匹配任意数量的数字或字母,后跟数字,以及任意数量的数字或字母。
这里是demo ...
答案 1 :(得分:3)
答案 2 :(得分:2)
由于其他答案提供了很多方法来解决您的问题,让我试着解释您witnessed的行为。
首先,Rubular特定于Ruby的正则表达式语义。 (我不知道Ruby和Python的RegEx引擎之间有什么不同的确切信息)。由于您已标记为python,因此您可能需要使用regex101或debuggex。我将使用这两个来解释。
现在,让我们看看您的实际RegEx和数据here。你的输入字符串是这样的
476dn
e586
9999
rrr
ABCF
正则表达式可以通过两种方式看到输入。带有换行符的长字符串或由换行符分隔的字符串列表。我们可以使用RegEx标志控制此行为,该标志称为多行标志(在Python中为re.MULTILINE
or re.M
)。引自Python文档,
re.M被
re.MULTILINE
指定时,模式字符
'^'
匹配字符串的开头和每行的开头(紧跟在每个换行符之后);模式字符'$'
在字符串的末尾和每行的末尾(紧接在每个换行符之前)匹配。默认情况下,'^'
仅匹配字符串的开头,'$'
仅匹配字符串的结尾,紧接在字符串末尾的换行符(如果有)之前。
例如,在我们的示例中,如果此标志为 NOT ,则输入字符串将被视为长字符串,其中包含换行符,^
将匹配{之前的位置} {1}}在第一行{1}}将匹配最后一行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
之后的位置由于它可以匹配多个位置,我们必须明确指定RegEx引擎,当我们使用多行字符串时,我们必须分别匹配每一行。在Python中,我们可以使用re.findall
到re.finditer
。在RegEx世界中,它通常用标志$
表示,全局搜索。
有了这个基本的了解,让我们再看看你的数据。默认情况下,我相信rubular已经启用了这两个功能。我们可以通过捕获组清楚地看到匹配,就像在此demo中一样,使用RegEx
F
我们可以找到与Python匹配的内容,例如
g
给定的模式匹配第一行和第二行,它应该是微不足道的。但是第一场比赛起初可能很难理解。当我们说^([\D]*[0-9]+[\D]*)$
时,它表示0个或更多不是数字的字符。因此,空字符串也可以与regex = re.compile(r"^[\D]*[0-9]+[\D]*$", re.MULTILINE)
print regex.findall(data)
# ['476pe', 'e586', '9999\nrrr\nABCF']
匹配。因此,在^[\D]*
的开头,[\D]*
匹配9999
之前的空字符串,然后[\D]*
匹配数字9999
和字符串的其余部分,直到结尾将与[0-9]+
匹配。它也匹配换行符,因为9999
除了数字之外的任何东西。因为,换行符不是数字,即使也是匹配的。
另请注意,[\D]*
也允许其他特殊字符。引用文档,
如果未指定
\D
标志,则匹配任何非数字字符;这相当于集合\D
。使用UNICODE
,它将匹配Unicode字符属性数据库中标记为数字的字符以外的任何内容。
因此,您可能希望更加明确,如tobias_k's answer
[^0-9]
这可以在Python中使用,就像这样
UNICODE
或者,如果您可以将字符串分成多个字符串,那么您可以
^[0-9a-zA-Z]*[0-9][0-9a-zA-Z]*$
答案 3 :(得分:1)
最简单的表达式是
[0-9]
这将匹配包含至少一个数字的每个字符串。
答案 4 :(得分:1)
请改为尝试:
(?im)^[a-z0-9]+$
示例:强>
if re.search("^[a-z0-9]+$", subject, re.IGNORECASE | re.MULTILINE):
# Successful match
else:
# Match attempt failed
<强>样本:强>
答案 5 :(得分:0)
你可能想要这个。
^(\D*\d+\D*)+$
小心\D
等同于[^0-9]
。