2015-02-09 6 views
-2

Я пытаюсь найти комбинацию дат. У меня есть следующее регулярное выражение.Ограничить количество появлений 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. Если есть какие-либо другие проблемы с этим регулярным выражением, пожалуйста, дайте мне знать. Помоги пожалуйста.

+0

есть дополнительные '\ s', которые будут соответствовать пробелам, для' 02 2004', это намеренно? –

+0

Вы хотите совместить '8 /// 23'? Опубликуйте несколько допустимых и недопустимых примеров. –

+0

Ваши регулярные выражения 99999, 9999, 999999 и 99 - 999, и 2 части + '1-555'-'123456' –

ответ

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, либо 2-значного числа с любыми цифрами.
  • \b - заканчивается границами слов (следующий символ не является буквенно-цифровым).

Это будет соответствовать следующие строки: 03-1902, 12/2014, 6/03

но не соответствует ни одному из 3/3009, 13/2009 или 26-30 или 3///60 или 12/34567.

Я использую [0-9] вместо \d, потому что \d зависит от региона.

DEMO


Чтобы соответствовать диапазон дат (? Вы, возможно, делать резюме/резюме парсер здесь), вы можете сделать:

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

+0

@Antii Haapala - Да. Фактически, это было частью всего матча, который я пытался сделать. Я отредактирую вопрос с более подробной информацией. Ваш ответ на контекст прав. Но мне нужно более сложное. Я поставлю сюда. – user3116355

+1

Пожалуйста, не надо, все ответы здесь на 1 вопрос, мне не нравится стрелять в движущуюся цель. –

+0

Хорошо. Тогда я отправлю новый вопрос. – user3116355

2

Изменение \d{2,4} в \d{2}(\d{2})?

Это поможет вам, что вы хотите.

Первый матч 2 цифры, а затем комбинация из двух цифр только один раз или нет.

Это точно 2 или 4 цифры.

+0

@AnttiHaapala Спасибо! Мой ответ обновлен. В вашем ответе есть что-то, что вам может понадобиться. '(?: 0? \ D | 1 [0-2])' эта часть будет соответствовать 00 или одному 0, возможно '(?: [1-9] | 0 [1-9] | 1 [0-2]) 'лучше (я не могу комментировать ответ других ...) – Lution

Смежные вопросы