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

时间:2014-04-22 07:50:14

标签: python regex

我有一系列的话,如下所示

476pe
e586
9999
rrr
ABCF

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

476pe
e586
9999

我试着编写一个正则表达式,如下所示

^[\D]*[0-9]+[\D]*$

但它不起作用。我使用在线正则表达式工具http://rubular.com/r/HQE2vG0pbu尝试了这一点,它显示整个字符串匹配。

6 个答案:

答案 0 :(得分:3)

你的正则表达式的问题是\D除了数字之外可以任何,所以它会错误地匹配那个位置有特殊字符的字符串,并且不能匹配超过一组数字。

相反,请尝试^[0-9a-zA-Z]*[0-9][0-9a-zA-Z]*$之类的内容。这将匹配任意数量的数字或字母,后跟数字,以及任意数量的数字或字母。

这里是demo ...

答案 1 :(得分:3)

如果您检查匹配项。 \d就足够了

或使用此:

[^a-zA-Z\n]

这将匹配前三个,但不会与那些只有字母的单词匹配。

演示:http://regex101.com/r/dO1tI1

答案 2 :(得分:2)

由于其他答案提供了很多方法来解决您的问题,让我试着解释您witnessed的行为。

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

现在,让我们看看您的实际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.findallre.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

<强>样本:

http://regex101.com/r/oG2wP1

答案 5 :(得分:0)

你可能想要这个。

^(\D*\d+\D*)+$

小心\D等同于[^0-9]