2016-06-21 7 views
0

Привет У меня есть список [tag1 tag2], я хотел бы узнать, является ли число следующего тега инкрементальным.Как найти элементы в списке подряд

match_atr_value = re.search('(.+)\~(\w+)',each_line) 
tags = match_atr_value.group(1).split('.') 
print tag 


Input: 
[tag1 tag2] 
[tag1 tag3] 
[tag1 tag2 tag4] 

Output: 
Incremental 
Not 
Not 

«Последовательные целые числа являются целыми числами, которые следуют друг за другом в порядке»

Есть более простой способ сделать это? Все, что мне нужно сделать, это проверить, является ли его инкрементным, и если да, я должен использовать их иначе, я должен выбросить исключение. Thanks

+0

Что вы имеете в виду последовательным ? –

+0

Здесь есть два независимых вопроса. Извлечение чисел и проверка того, является ли список чисел последовательным. С кем у вас проблемы? – interjay

ответ

4

Вы можете извлечь все цифры следуют tag через re.findall(), а затем использовать enumerate() и all(), чтобы проверить, если эти номера являются последовательными:

import re 

l = [ 
    "[tag1 tag2]", 
    "[tag1 tag3]", 
    "[tag1 tag2 tag4]" 
] 

pattern = re.compile(r"tag(\d+)") 
for item in l: 
    numbers = map(int, pattern.findall(item)) # if Python 3: call list() on that 
    result = all(index == item for index, item in enumerate(numbers, start=numbers[0])) 
    print(result) 

Печать:

True 
False 
False 
0

Если бы я был вами, я бы избегал регулярного выражения и делал что-то вроде ниже. Я получаю число из строки, будь то начало, конец и т.д., а затем сравнить его с предыдущим значением и return False, если она не растет

def isIncreasing(listy): 
     prev = 0 
     for w in listy: 
       val = [''.join(s) for s in w if s.isdigit()] 
       cur = int(val[0]) 
       if cur != prev+1: 
         return False 
       prev = cur 
     return True 
+0

Мне пришлось использовать reg ex, поскольку мне нужно 're.search ('(. +) \ ~ (\ W +)'', чтобы иметь значение во второй группе. Я задал вопрос, чтобы решить результаты первая группа. Спасибо – user1958532

+0

Я думаю, что «увеличение» и «последовательное» - это разные вещи. – Kevin

+0

Отредактировано должно быть ** последовательным ** – Brian

0
tag1val = int(re.search(r'\D*(\d+)', tag1).group(1)) 
tag2val = int(re.search(r'\D*(\d+)', tag2).group(1)) 
(tag1val - tag2val) == -1 
    True 
tag3val = int(re.search(r'\D*(\d+)', tag3).group(1)) 
(tag1val - tag3val) == -1 
    False 
(tag2val - tag3val) == -1 
    True 

Если вы хотите придерживаться регулярных выражений, может пойти по этому маршруту. Если разность равна -1, то одна справа имеет значение 1 больше, чем значение слева.

+0

Пожалуйста, не используйте 'is' при проверке равенства. Не гарантируется, что' -1 является -1' оценивается как True (это почти наверняка делает для большинства разумных реализаций Python, но это не то, на что вы должны зависеть) – Kevin

+0

Спасибо Kevin, я вернусь и отредактирую его. –

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