Проверка наличия разделителя после каждых 2 символов

#python

#python

Вопрос:

Есть ли способ проверить, есть ли разделитель после каждых 2 символов в строке.

Например:

 x = '32-21-44-33':
  # if there is '-' after every 2 digits, return True

# so if x = '231-21-21-21' it would return as False
 

Комментарии:

1. Каким должен быть результат, если x='32-21-44-33-' ?

Ответ №1:

Я бы сформулировал ваше требование, используя шаблон регулярных выражений:

 ^d{2}(?:-d{2})*$
 

Пример сценария:

 inp = '32-21-44-33'
if re.search(r'^d{2}(?:-d{2})*


Ответ №2:

лучший и самый простой способ

 z = x.split("-")
for j in z:
    if len(j)!=2 :
        print("false")
 

Комментарии:

1. Это не очень хороший ответ. Он полон синтаксических ошибок, и это не работает.

2. они могут управлять синтаксисом Я новичок в stackoverflow, поэтому я не знаю, как правильно делать отступы в коде

3. Нет, дело не только в отступе. Этот ответ просто неверен.

4. Я думаю, что теперь все в порядке

5. Вы должны проверять все случаи, когда вы пишете ответ.

Ответ №3:

Один из способов - разрезать строку и проверить с помощью all() .

Если вы просто хотите проверить, что - находится в каждой позиции 3 в вашей строке, то вы можете просто сделать:

 >>> my_str = '32-21-44-33'
>>> all(x=='-' for x in my_str[2::3])
True
 

И если вы хотите убедиться, что "-" присутствует только в третьей позиции, а не где-либо еще, тогда вы можете использовать itertools.groupby() как:

 >>> from itertools import groupby

>>> all(list(j)[0] == '-' if i else len(list(j))==2 for i, j in groupby(my_str, key=lambda x: x=='-'))
True
 

Однако, если вы хотите убедиться, что ваша строка строго соответствует шаблону из двух чисел, за которыми следует "-", то вы можете добиться этого, дополнительно используя zip() with sliced strings как:

 >>> all(z=='-' and (x   y).isdigit() for x, y, z in zip(my_str[::3], my_str[1::3], my_str[2::3]))
True
 

Комментарии:

1. Это возвращает true для недопустимых строк, таких как '32-21-44-33--' , '32-21-44-33-1' , '32-21-44----33' и т.д.

2. @mhawke спасибо, что указали на это, я исправил это сейчас

Ответ №4:

Вы можете использовать split() with - в качестве разделителя для разделения слов, а затем использовать all() , чтобы убедиться, что все они имеют желаемую длину или другие свойства:

 >>> x = '32-21-44-33'
>>> all(len(s) == 2 for s in x.split('-'))
True
>>> x = '231-21-21-21'
>>> all(len(s) == 2 for s in x.split('-'))
False
 

Если вы хотите убедиться, что все они тоже числовые:

 >>> x = '32-21-44-33'
>>> all(len(s) == 2 and s.isdigit() for s in x.split('-'))
True
>>> x = '32-ab-44-33'
>>> all(len(s) == 2 and s.isdigit() for s in x.split('-'))
False
 

Ответ №5:

Проверьте каждый 3-й символ, чтобы увидеть, равен ли он тире. Если это не так, немедленно верните false . Если вы дойдете до конца строки, верните true .

 x = 2
while x < len(mystring):
    if mystring[x] != '-':
        return False
    x  = 3
return True
 

Ответ №6:

Если вы не знаете разделитель, есть простой "понятный" способ сделать это

 x = '32-21-45-33'
    
# split list with the third char of the string, then sort the list by element length

sorted_list = sorted(x.split(x[2]), key=len)

# if your first element length is equal to your last element length all element are the same length

if len(sorted_list[0]) == len(sorted_list[len(sorted_list) - 1]):
   print("ok")
else
    print("nok")
 

Ответ №7:

Здесь вы получаете oneliner, возвращающий bolean неизвестный разделитель

 def check_every_n(x,n):
    return (len(list(set([x[i] for i in range(n,len(x)-n) if (i 1) % (n 1) == 0]))) == 1), x[n]

x = '32-21-44-33'

n = 2

print (check_every_n(x,n))
 

Вы берете свою строку x , свой тест n , вы используете понимание списка для построения списка элементов каждого n в строке, вы удаляете дубликаты, если len() = 1 означает, что в каждом есть один и тот же элемент n , и поэтому вы возвращаете проверку bolean разделитель в n индексе позиции n - 1 .

Вывод:

 (True, '-') # n = 2
(False, '2') # n = 3
 

Бесполезно говорить, что если логическое значение равно False, разделитель не имеет смысла.

С помощью этого вы можете проверять наличие любого разделителя каждые n. Так что вам не нужно об этом упоминать. Кроме того, вы можете выполнить цикл, чтобы найти любой разделитель в любом n, если хотите.

Допустим, верните bolean и разделитель, если есть, с интервалом от 2 до len(x)//3 (чтобы разрешить повторы):

 x = '2403-0132-1321-3123'

for n in range(2,len(x)//3):

    print (n,check_every_n(x,n))
 

Вывод:

 2 (False, '0')
3 (True, '3')
4 (True, '-')
5 (False, '0')
 

, inp):
print("MATCH") # prints MATCH

Ответ №2:

лучший и самый простой способ


Комментарии:

1. Это не очень хороший ответ. Он полон синтаксических ошибок, и это не работает.

2. они могут управлять синтаксисом Я новичок в stackoverflow, поэтому я не знаю, как правильно делать отступы в коде

3. Нет, дело не только в отступе. Этот ответ просто неверен.

4. Я думаю, что теперь все в порядке

5. Вы должны проверять все случаи, когда вы пишете ответ.

Ответ №3:

Один из способов — разрезать строку и проверить с помощью all() .

Если вы просто хотите проверить, что - находится в каждой позиции 3 в вашей строке, то вы можете просто сделать:


И если вы хотите убедиться, что «-» присутствует только в третьей позиции, а не где-либо еще, тогда вы можете использовать itertools.groupby() как:


Однако, если вы хотите убедиться, что ваша строка строго соответствует шаблону из двух чисел, за которыми следует «-«, то вы можете добиться этого, дополнительно используя zip() with sliced strings как:


Комментарии:

1. Это возвращает true для недопустимых строк, таких как '32-21-44-33--' , '32-21-44-33-1' , '32-21-44----33' и т.д.

2. @mhawke спасибо, что указали на это, я исправил это сейчас

Ответ №4:

Вы можете использовать split() with - в качестве разделителя для разделения слов, а затем использовать all() , чтобы убедиться, что все они имеют желаемую длину или другие свойства:


Если вы хотите убедиться, что все они тоже числовые:


Ответ №5:

Проверьте каждый 3-й символ, чтобы увидеть, равен ли он тире. Если это не так, немедленно верните false . Если вы дойдете до конца строки, верните true .


Ответ №6:

Если вы не знаете разделитель, есть простой «понятный» способ сделать это


Ответ №7:

Здесь вы получаете oneliner, возвращающий bolean неизвестный разделитель


Вы берете свою строку x , свой тест n , вы используете понимание списка для построения списка элементов каждого n в строке, вы удаляете дубликаты, если len() = 1 означает, что в каждом есть один и тот же элемент n , и поэтому вы возвращаете проверку bolean разделитель в n индексе позиции n - 1 .

Вывод:


Бесполезно говорить, что если логическое значение равно False, разделитель не имеет смысла.

С помощью этого вы можете проверять наличие любого разделителя каждые n. Так что вам не нужно об этом упоминать. Кроме того, вы можете выполнить цикл, чтобы найти любой разделитель в любом n, если хотите.

Допустим, верните bolean и разделитель, если есть, с интервалом от 2 до len(x)//3 (чтобы разрешить повторы):


Вывод: