这个正则表达式(?:\ d [ - ] *?){13,16} \ b如何工作?

时间:2016-04-10 17:52:41

标签: python regex

有些人喜欢在写信用卡号时将-或空格放在数字子组之间,因此上述RE无法捕获它们。

请你解析RE:

(?:\d[ -]*?){13,16}\b

并解释为什么它可以解决问题?

我知道*?将匹配前一个元素零次或多次,但次数尽可能少。

3 个答案:

答案 0 :(得分:1)

  • (?:一些正则表达式)表示非捕获组

  • \ d表示十进制已经过了,例如[0-9]

  • []表示匹配此中的任何字符。

  • 实际上[ - ]表示找空格或 -

  • *表示0或更多

  • {}是(xMin,xMax)重复的范围

  • {13,16} =>重复13次或更多但少于17次

  • \ b表示模式必须通过前置标记终止。

对于这个问题\ b请参考非捕获组

您可以在http://regexr.com/上尝试此正则表达式的行为。

一些有效的模式是:

  

0332 - 221 - 212 - 111

     

0-11 -0151- 0151 - 10

     <00> 0000 - 0000 - 0000 - 0

     <00> 0000 - 0000 - 0000 - 00

     <00> 0000 - 0000 - 0000 - 000

     <00> 0000 - 0000 - 0000 - 0000

     

00000 - 0000 - 0000

     

0000-0000-0000-0000

     

0-0-0-0-0-0-0-0-00-0-0-0

答案 1 :(得分:0)

首先,捕获组用于对RegEx的部分进行分组。通过将()放在组中所需的数据周围来定义它们。通过在?:内添加()来定义非捕获组,如此(?:data)

其次, Lazy RegEx试图尽可能少地捕获,而不是尽可能多地捕获。查看this StackOverflow question

RegEx如何运作:

(?:          # Non-Capturing Group
  \d           # Digit
  [ -]*?       # Space or - (Hyphen), 0 or more times (Lazy)
)
{13,16}      # Repeats the Non-Capturing Group 13 to 16 times
\b           # Word Boundary

非捕获组将匹配任何包含1位数字的字符串,以及任意数量的空格(空格)和 - (连字符)。因此,9-9-- 9 -9- - - 9 - - -都是匹配。

然后该组可以重复13到16次,所以上面的例子可以重复13到16次,以匹配每个信用卡数字

所以这些都是完全有效的匹配:

9999 - 9999 - 9999 - 9
9999 - 9999 - 9999 - 99
9999 - 9999 - 9999 - 999
9999 - 9999 - 9999 - 9999
999 - 999 - 999 - 999 - 999
99-99-99-99-99-99-99
9-9-9-9-9-9-9-9-9-9-9-9-9

Live Demo on Regex101

Demo

答案 2 :(得分:0)

\d匹配一个数字(Does "\d" in regex mean a digit?

\b标记了单​​词/数字的结尾

[0-9]{13-16}表示括号中重复的字符,为13,14,15或16次。背景是旧信用卡号码有13位数的新信用卡号码有16位数。

因此,\b\d{13,16}\b会查找/匹配13到16位数的任何序列,这意味着它可用于查找信用卡号,而无需使用任何&#39;

?:是另一个特殊情况,意味着“无需捕获群集”(use of colon symbol in regular expression

(?:pattern)用于匹配模式,但不捕获它,导致从结果字符串中删除被质疑的字符,即&#39; - &#39; (What is a non-capturing group? What does a question mark followed by a colon (?:) mean?

*表示在

之前元素中的字符重复零次或多次

?表示之前元素中的字符可以显示,但不必

*?(在上面的正则表达式中使用)是非贪婪/懒惰版本,即[^a]*?表示&#34; 0个或更多字符的序列,不包含&#39; a&# 39;,在符合正则表达式的其余部分时尽可能短。&#34;

因此,正则表达式匹配任意长度为13到16的数字序列,其中包含任意数量的&#39; - &#39;和&#39; &#39; (空格)

请注意,非捕获组?:匹配但不捕获结果中的子字符串:应用于字符串\b(a)(?:b)(c)\b的正则表达式"abc"匹配,但结果中非跳过捕获组(组是( )中的所有内容):

match: "abc", match1: "a", match2: "c"(&#34; b&#34;未出现在匹配列表中)

但是,可以通过调用group()对象上的match来检索完整匹配,请参阅下面的Alan Moore的评论。

您可以在https://regex101.com/

上对此进行测试

请参阅此Regex credit card number tests