#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})'