2015-08-23 2 views
0

Я новичок в регулярных выражениях и разработал это, чтобы выяснить, имеет ли idno значения от 0 до 9 в первых девяти символах и V, v, X или x в качестве последнего. Правильно ли синтаксис, потому что он отправляет ошибку с запросом двух аргументов. Другая проблема заключается в том, что она должна быть длиной всего 10 символов. Я использовал отдельный код для проверки этого, но могу ли я интегрировать его в это тоже?Регулярные выражения - python

if len(idno) is 10: 
    if re.match("[0-9]{9}[VvXx],idno") == true: 
     print "Valid" 

ответ

6

У вас там больше ошибок, чем правых, я боюсь. Обратите внимание на следующие:

  • Вы должны реально сравнить целые числа от равенства (== 10) не идентичностью (is 10) - CPython стажеров небольших целых чисел, так что ваш текущий код будет работать, но это деталь реализации вы не должны» t полагаться;
  • Если вы добавите $ (конец строки) в конец, регулярное выражение будет соответствовать только целым десятизначным символам, в противном случае проверка len не понадобится;
  • Кавычки находятся не в том месте, поэтому вы передаете одну строку в re.match, а не в шаблон и имя, которое вы хотите попытаться сопоставить - запятая и idno - все это часть параметра pattern;
  • 'true' != 'True': Python чувствителен к регистру, а булевы начинаются с заглавных букв;
  • re.match возвращает либо объект SRE_Match, либо None, ни один из которых == True. Тем не менее, это довольно неудобно писать == True, даже если вы только получаете True или False, и вы можете использовать тот факт, что Match есть истина-у и None ложно-у, чтобы написать гораздо аккуратнее if some_thing:, а не if some_thing == True:; и
  • Регулярные выражения уже имеют покрытие корпуса [0-9], вы можете использовать только \d (d igit). Поэтому

Ваш код должен быть:

if re.match(r'\d{9}[VvXx]$', idno): 
      #^note 'raw' string, to avoid escaping the backslash 
    print "Valid" 

Вы могли бы упростить дальнейшее используя re.IGNORECASE флаг и сделать группу для последнего символа [vx]. Несколько примеров:

>>> import re 
>>> for test in ('123456789x', '123456789a', '123abc456x', '123456789xa'): 
    print test, re.match(r'\d{9}[vx]$', test, re.I) 
              #^shorter version of IGNORECASE 


123456789x <_sre.SRE_Match object at 0x10041e308> # valid 
123456789a None # wrong final letter 
123abc456x None # non-digits in first nine characters 
123456789xa None # start matches but ends with additional character 
+0

Вы забудете доллар. 'r '\ d {9} [vx] $'' –

+0

@AvinashRaj хороший улов, спасибо – jonrsharpe

+0

Thanx люди, очень ценные :) – ruvinda

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