Python Regex - Как извлечь третью часть? - PullRequest
0 голосов
/ 17 февраля 2019

Мои данные имеют следующий формат: (xxx)yyyy(zz)(eee)fff где {x, y, z, e, f} - все числа.Но fff является необязательным.

Ввод: x = (123)4567(89)(660)

Ожидаемый вывод: только часть eee, то есть число внутри 3-го "()", то есть 660 в моем примере.

Я могу достичь этого до сих пор:

re.search("\((\d*)\)", x).group()

Вывод: (123)

Ожидаемый: (660)

Я наверняка что-то упускаюфундаментальна.Пожалуйста, сообщите.

Редактировать 1: Просто добавили fff к формату входных данных.

Ответы [ 3 ]

0 голосов
/ 17 февраля 2019

Если вы хотите получить третью группу чисел в скобках, вам нужно пропустить первые две группы, которые вы можете сделать с повторяющейся группой без захвата, которая ищет набор цифр, заключенных в (), за которым следуют некоторыеколичество не ( символов:

x = '(123)4567(89)(660)'
print(re.search("(?:\(\d+\)[^(]*){2}(\(\d+\))", x).group(1))

Вывод:

(660)

Демонстрация на тестере

0 голосов
/ 17 февраля 2019

Вы можете найти все те совпадения, которые имеют круглые скобки (), и напечатать третье совпадение с помощью findall

import re
n = "(123)4567(89)(660)999"
r = re.findall("\(\d*\)", n)
print(r[2])

Вывод:

(660)
0 голосов
/ 17 февраля 2019

Часть (eee) идентична части (xxx) в вашем регулярном выражении.Если вы не предоставите привязку или какое-либо требование к последовательности, то поиск без поиска будет соответствовать первому найденному значению, которое в вашем случае равно (xxx).

Если вы знаете, что всегда появляется (eee)в конце строки вы можете добавить якорь «в конце» ($), чтобы вызвать совпадение в конце.Или, возможно, вы можете добавить следующий символ, например, пробел, запятую или что-то в этом роде.

В противном случае вы могли бы преуспеть, чтобы сопоставить другие части шаблона и не захватывать их:

pattern = r'[0-9()]{13}\((\d{3})\)'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...