Regex - получение данных до первого появления двух разных последовательностей - PullRequest
0 голосов
/ 24 октября 2019

Мне дали строку, которая содержит действительные коды и иногда недопустимые коды. Каждая строка структурирована с ...valid for 111, 333, 555. Строка может заканчиваться точкой или включать один из следующих (except 3331, 3332, 5554)., except 3331, 5555. или except(3331, 5554). в списке допустимых кодов. В каждом предложении также могут быть дополнительные примечания, которые не относятся к делу, но могут содержать цифры.

Пример: ... 111, 222, 333 (except 3331, 3332, 3339), 444, 555, 77781, and 89. Note: Look up doc 432

Мне нужно проанализировать строку, чтобы получить список действительных цифровых кодов. а также список исключений. Я получил все до периода с ^[^.]+ и все до слова, кроме с .+?(?=except), но не могу понять, как сделать первый проход, чтобы получить действительные коды до . или except, которые когда-либона первом месте.

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

1 Ответ

0 голосов
/ 24 октября 2019
import re

text = "Example: ... valid for 111, 222, 333 (except 3331, 3332, 3339), 444, 555, 77781, and 89. Note: Look up doc 432"

m = re.search(r'valid for ([^.]+)\.', text) #everything between  'valid for ' and first '.'
text1 = m.group(1)
valid_numbers = re.findall(r'\b\d+\b', text1) # first find all numbers
m = re.search(r'except([^.)]*)[.)]', text) # everything between 'except' and either ')' or '.'
text2 = m.group(1)
except_numbers = re.findall(r'\b\d+\b', text2) # find the "except" numbers
# remove the "except" numbers from valid_numbers
for i in range(len(valid_numbers) - 1, -1, -1):
    if valid_numbers[i] in except_numbers:
        del[valid_numbers[i]]
print(valid_numbers)
print(except_numbers)

Отпечатки:

['111', '222', '333', '444', '555', '77781', '89']
['3331', '3332', '3339']

См. Демонстрацию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...