Проверьте строку для / против символов в Python - PullRequest
1 голос
/ 11 ноября 2009

Мне нужно знать разницу между строкой, которая может содержать букв и цифр , и строкой, которая может содержать чисел, двоеточий и дефисов .

>>> def checkString(s):
...   pattern = r'[-:0-9]'
...   if re.search(pattern,s):
...     print "Matches pattern."
...   else:
...     print "Does not match pattern."

# 3 Numbers seperated by colons. 12, 24 and minus 14
>>> s1 = "12:24:-14"
# String containing letters and string containing letters/numbers.
>>> s2 = "hello"
>>> s3 = "hello2"

Когда я запускаю метод checkString для каждой из вышеуказанных строк:

>>>checkString(s1)
Matches Pattern.
>>>checkString(s2)
Does not match Pattern.
>>>checkString(s3)
Matches Pattern

s3 - единственный, кто не делает то, что я хочу. Я хотел бы иметь возможность создавать регулярные выражения, которые допускают числа, двоеточия и дефисы, но исключают ВСЕ остальное (или только буквы алфавита). Кто-нибудь может указать мне правильное направление?

EDIT:

Поэтому мне нужно регулярное выражение, которое бы приняло:

229            // number
187:657        //two numbers
187:678:-765   // two pos and 1 neg numbers

и отклонение:

Car          //characters
Car2         //characters and numbers

Ответы [ 4 ]

5 голосов
/ 11 ноября 2009

вам нужно соответствовать всю строку, а не один символ, как вы делаете в данный момент:

>>> re.search('^[-:0-9]+$', "12:24:-14")
<_sre.SRE_Match object at 0x01013758>
>>> re.search('^[-:0-9]+$', "hello")
>>> re.search('^[-:0-9]+$', "hello2")

Чтобы объяснить регулярное выражение:

  • в квадратных скобках (класс символов): сопоставлять цифры от 0 до 9, дефис и двоеточие, только один раз.
  • + - это квантификатор, который указывает, что предыдущее выражение должно совпадать столько раз, сколько возможно, но хотя бы один раз.
  • ^ и $ соответствуют началу и концу строки. Для однострочных строк они эквивалентны \A и \Z.

Таким образом, вы ограничиваете содержимое всей строки по крайней мере одной чартерной длиной и будете содержать любые перестановки символов из класса символов. То, что вы делали раньше, - это поиск одного символа из класса символов в строке темы. Вот почему s3 содержит соответствующую цифру.

1 голос
/ 11 ноября 2009

Ответ SilentGhost довольно хороший, но учтите, что он также будет соответствовать строкам типа "---::::" без цифр.

Я думаю, вы ищете что-то вроде этого:

'^(-?\d+:)*-?\d+$'
  • ^ Соответствует началу строки.
  • (-?\d+:)* Возможно - знак, хотя бы одна цифра, двоеточие. Весь этот шаблон 0 или много раз.
  • -?\d+ Затем шаблон снова, хотя бы один раз, без двоеточия
  • $ Конец строки

Это будет лучше соответствовать строкам, которые вы описываете.

0 голосов
/ 11 ноября 2009

Ваше регулярное выражение почти в порядке; вам просто нужно, чтобы он соответствовал всей строке. Кроме того, как отметил комментатор, в данном случае вам не нужна необработанная строка (префикс r в строке). Вуаля:

def checkString(s):
  if re.match('[-:0-9]+$', s):
    print "Matches pattern."
  else:
    print "Does not match pattern."

«+» означает «соответствует одному или нескольким предыдущим выражениям». (Это заставит checkString возвращать False для пустой строки. Если вы хотите, чтобы True для пустой строки, измените «+» на «*».) «$» Означает «соответствует концу строки».

re.match означает «строка должна соответствовать регулярному выражению, начинающемуся с первого символа»; re.search означает «регулярное выражение может соответствовать последовательности в любом месте строки».

Кроме того, если вам нравится преждевременная оптимизация, а кому нет, учтите, что re.match нужно каждый раз компилировать регулярное выражение. Эта версия компилирует регулярное выражение только один раз:

__checkString_re = re.compile('[-:0-9]+$')
def checkString(s):
  global __checkString_re
  if __checkString_re.match(s):
    print "Matches pattern."
  else:
    print "Does not match pattern."
0 голосов
/ 11 ноября 2009
pattern = r'\A([^-:0-9]+|[A-Za-z0-9])\Z'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...