#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
(чтобы разрешить повторы):
Вывод: