Получение тега версии для различных входных данных

#python

#python

Вопрос:

ВВОД:-

 tag#1INCLUDED IN DATABUILD: SU_TAG_PL_DATA.LA.3.6.1.00.00.042.1
tag#2INCLUDED IN DATABUILD: SU_TAG_PL_DATA.LA.3.6.00.00.042.1
tag#3INCLUDED IN DATABUILD: SU_TAG_PL_DATA.LA.3.6.00.042.1
tag#4INCLUDED IN DATABUILD: SU_TAG_PL_DATA.LA.3.6.1.c2.00.00.042.1
tag#5INCLUDED IN DATABUILD: SU_TAG_PL_DATA.LA.3.6.1.c2.00.00.042
 

код:-

Привет,

У меня есть следующий код, который работает для тега # 1 во входных данных, показанных выше, но не работает для других тегов, вывод должен быть «042» для всех входных данных .. может кто-нибудь подсказать, как это исправить?

 import re
comments = [{u'timestamp': 1403046914, u'message': u'Patch Set 1: Looks good to me, but someone else must approvennThis patchset has been processed by the Gator.', u'reviewer': {u'username': u'gator', u'name': u'Gator Service Account', u'email': u'gator@localhost'}}, {u'timestamp': 1403051700, u'message': u'Patch Set 1: Developer Build and Test SuccessfulnnINCLUDED IN DATABUILD: SU_TAG_PL_DATA.LA.3.6.1.00.00.042.1nnhttp://qwiki.company.com/div_wcnss/SU_TAG_PL_DATA.LA.3.6.1.c2.00.00.042.1', u'reviewer': {u'username': u'username', u'name': u'user name2 ', u'email': u'username@div.company.com'}}, {u'timestamp': 1403052176, u'message': u'Patch Set 1: Looks good to me, approvednn', u'reviewer': {u'username': u'username2', u'name': u'user full name', u'email': u'username2@div.company.com'}}]

matchobj = re.search(r"INCLUDED IN DATABUILD:s S ?.(?:d .){5}(d )(?:.d )?", str(comments))
print matchobj

build = matchobj.group(1)
print build

chunks = build.split('.')
print chunks

last_one = chunks[-1]
print last_one
 

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

1. Содержит только tag1 семь чисел, разделенных точкой, и в этой части (?:d .){5}(d )(?:.d ) ожидается семь чисел.

2. @furas — можем ли мы изменить регулярное выражение на общее, чтобы оно соответствовало всем тегам, отображаемым во входных данных

3. Существует проблема с 042 — иногда это последнее число, иногда это не так. Это может быть четвертое / пятое / шестое число с начала. Не существует единого четкого правила. Как вы распознаете это число? Я вижу только одно правило — 3 цифры. всегда ли это число состоит из 3 цифр?

Ответ №1:

Если вы ищете первое 3-значное число INCLUDE после этого, вы можете использовать

 import re

examples = [
    'tag#1INCLUDED IN DATABUILD: SU_TAG_PL_DATA.LA.3.6.1.00.00.041.1 - next 3-digits numer 007',
    'tag#2INCLUDED IN DATABUILD: SU_TAG_PL_DATA.LA.3.6.00.00.052.1 - next 3-digits numer 007',
    'tag#3INCLUDED IN DATABUILD: SU_TAG_PL_DATA.LA.3.6.00.042.1 - next 3-digits numer 007',
    'tag#4INCLUDED IN DATABUILD: SU_TAG_PL_DATA.LA.3.6.1.c2.00.00.142.1 - next 3-digits numer 007',
    'tag#5INCLUDED IN DATABUILD: SU_TAG_PL_DATA.LA.3.6.1.c2.00.00.002 - next 3-digits numer 007'
]

for x in examples:
    r = re.search(r'INCLUDED IN DATABUILD.*?(d{3})', x)
    print( r.group(1) )
 

В примере я заменил 042 на разные числа, чтобы лучше видеть результаты.

 041
052
042
142
002
 

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

1. как я могу изменить его на поиск первого 3-значного или 4-значного числа?

2. Использовать {3,4} в r'INCLUDED IN DATABUILD.*?(d{3,4})'