Захват всех групп по шаблону

avatar
daedsidog
1 июля 2021 в 19:50
44
1
2

У меня есть что-то похожее на это:

A: 1 2 3 4
B: 5 6 7 8
C: 9 10 11 12

Меня интересует запись чисел в строке B. Другими словами, я хочу сопоставить [' 5',' 6',' 7',' 8']. Имейте в виду, что мне не гарантируется, что количество строк или количество цифр будет таким же, как в моем примере.

Ближайшее, что я нашел, это (?<=B:)( \d+)*, что соответствует:

enter image description here

Как правильно сделать то, что я хочу строго в регулярных выражениях Python? Возможно ли это?

Редактировать: некоторые люди справедливо упомянули, что я мог бы просто захватить строку, а затем использовать разделение внутри Python. Это, безусловно, работает, но проблема в том, что я могу использовать только одно регулярное выражение.

Источник
Christian Sloper
1 июля 2021 в 20:01
0

Вы рассматривали возможность использования split?

daedsidog
1 июля 2021 в 20:03
0

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

Wiktor Stribiżew
1 июля 2021 в 20:16
0

Поскольку то, о чем вы просите, невозможно, рассмотрите возможность изменения рабочего процесса.

daedsidog
1 июля 2021 в 20:43
0

@WiktorStribiżew Я боялся, что это будет невозможно, но я должен был убедиться.

Ответы (1)

avatar
The fourth bird
1 июля 2021 в 19:56
2

Использование модуля регулярных выражений PyPi, который поддерживает квантификатор в утверждении просмотра назад:

(?<=B:[ \d]*)\d+

Шаблон соответствует:

  • (?<= Положительный взгляд назад, утверждение, что слева есть
    • B:[ \d]* Совпадение B: и необязательные пробелы или цифры
  • ) Близкий обзор
  • \d+ Совпадение 1+ цифр

См. демонстрацию регулярного выражения или демонстрацию Python.

import regex

pattern = r"(?<=B:[ \d]*)\d+"

s = ("A: 1 2 3 4\n"
     "B: 5 6 7 8\n"
     "C: 9 10 11 12")

print(regex.findall(pattern, s))

Вывод

['5', '6', '7', '8']

Если вы не можете использовать модуль регулярного выражения, вы можете использовать группу захвата и разделить:

import re

pattern = r"B: (\d+(?: \d+)*)"

s = ("A: 1 2 3 4\n"
     "B: 5 6 7 8\n"
     "C: 9 10 11 12")

res = re.search(pattern, s)
if res:
     print(res.group(1).split())

Вывод

['5', '6', '7', '8']
daedsidog
1 июля 2021 в 19:58
0

Без него никак нельзя? К сожалению, я ограничен в реализации и могу предоставить только RegEx для использования с модулем re.

The fourth bird
1 июля 2021 в 20:02
0

@daedsidog Я добавил версию с группой захвата и разделением.

daedsidog
1 июля 2021 в 20:07
0

Спасибо, но, к сожалению, я не могу его использовать :(

The fourth bird
1 июля 2021 в 20:11
0

@daedsidog Какие возможные значения для B:? только одна цифра? Каково максимальное количество вхождений?

daedsidog
1 июля 2021 в 20:42
0

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