限制正则​​表达式的出现次数

时间:2015-02-09 07:01:35

标签: python regex

我想找到日期的组合。我有以下正则表达式。

\b([\d]{1,2}[\/\s-]{0,3}\d{2,4})

我想匹配以下组合:

8/1967 or 8-1967 
08/1967 same
8/67   same
08/67   same

我不希望它与以下

匹配
08/967

这就是我想要" /"之后的组合。或" - "为2位数或4位数。 但是" \ d {2,4}"如果2,3和4会给出组合。但是我不知道如何将它限制为2或4.如果这个正则表达式有任何其他问题,请告诉我。求助。

3 个答案:

答案 0 :(得分:3)

如果您要匹配月份和年份,请执行

\b((?:0?[1-9]|1[0-2]) ?[/-] ?(?:[12][0-9])?[0-9]{2})\b

说明:

  • \b - 非字母数字和字母数字字符之间的字边界
  • (?:0?[1-9]|1[0-2]) - 1-12和01-12(前导零)
  • ? - 分隔符两侧可能的空格
  • [-/] 1个分隔符,或 - 或/
  • (?:[12][0-9])?[0-9]{2}) - 以1或2开头的4位数字,或任意数字的2位数字。
  • \b - 以字边界结尾(下一个字符不是字母数字)。

这将匹配以下字符串:03-190212 / 20146 / 03

但不会与3 / 300913/200926-303///6012/34567中的任何一个匹配。

我使用[0-9]代替\d,因为\d依赖于区域设置。

DEMO


要匹配日期范围(你可能在这里做cv / resume解析器?),你可以这样做:

date_re = r'\b((?:0?[1-9]|1[0-2]) ?[/-] ?(?:[12][0-9])?[0-9]{2})\b'
date_span = r'%s(?:[\s-]+)-\s*%s' % (date_re, date_re)

date_span中生成以下正则表达式:

\b((?:0?[1-9]|1[0-2]) ?[/-] ?(?:[12][0-9])?[0-9]{2})\b(?:[\s-]+)-\s*\b((?:0?[1-9]|1[0-2]) ?[/-] ?(?:[12][0-9])?[0-9]{2})\b

DEMO

答案 1 :(得分:2)

\d{2,4}更改为\d{2}(\d{2})?

这会让你得到你想要的。

首先匹配2位数字,然后是两位数组合只有一次。

这恰好是2或4位数。

答案 2 :(得分:0)

\b((?<!\/)[\d]{1,2}[\/\s-]{0,3}(?!\d{3}\b)\d{2,4})

试试这个。看看演示。

https://regex101.com/r/wX9fR1/11

(?!\d{3}\b将使3位数字不匹配。