Регулярное выражение в Python - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь извлечь определенное число из различных строк.Номер должен быть автономным, до ' или до (.Приведенное мной регулярное выражение: \b(?<!\()(x)\b(,|\(|'|$) <- <code>x - это числовое число.

Если x равно 2, это приводит к тому, что следующая строка (почти) в порядке, за исключением того, что она также тянет2'abd'.Любой совет, что я здесь не так сделал?

2(2'Abf',3),212,2'abc',2(1,2'abd',3)

1 Ответ

0 голосов
/ 28 мая 2018

Ваш настоящий вопрос, насколько я понимаю, получить эти конкретные числа, кроме тех, которые указаны в скобках.

Для этого я предлагаю использовать шаблон skip_what_to_avoid|what_i_want, например:

(\((?>[^()\\]++|\\.|(?1))*+\))
|\b(2)(?=\b(?:,|\(|'|$))

Идея здесь в том, чтобы полностью игнорировать общие совпадения (и там первая группа использует рекурсивный шаблон для захвата всего, что находится в скобках: (\((?>[^()\\]++|\\.|(?1))*+\))): это мусорное ведро.Вместо этого нам нужно только проверить группу захвата $ 2, которая, когда установлена, содержит звездочки вне комментариев.

Демо

Пример кода:

import regex as re

regex = r"(\((?>[^()\\]++|\\.|(?1))*+\))|\b(2)(?=\b(?:,|\(|'|$))"
test_str = "2(2'Abf',3),212,2'abc',2(1,2'abd',3)"

matches = re.finditer(regex, test_str, re.MULTILINE)

for matchNum, match in enumerate(matches):
    matchNum = matchNum + 1
    if match.groups()[1] is not None:
        print ("Found at {start}-{end}: {group}".format(start = match.start(2), end = match.end(2), group = match.group(2)))

Вывод:

Found at 0-1: 2
Found at 16-17: 2
Found at 23-24: 2

Для этого решения требуется альтернативный пакет Python regex .

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