Регулярное выражение, совпадающее со всеми вхождениями - PullRequest
0 голосов
/ 03 мая 2018

Я принес до

instance_name(.+)(?=instance_name)

Моя тестовая строка:

instance_name DEDUP

iops,other,1

instance_name USERSPACE_APPS

iops,read,158534981

iops,write,168514545

iops,other,1557566878

total_latency,read,38774076988

total_latency,write,36596756500

total_latency,other,96023066014

time

Это соответствует только

DEDUP

iops,other,1

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

Я использую Python. Есть предложения?

EDIT

Ожидаемый результат:

Match1:

DEDUP

    iops,other,1

Match2: 
USERSPACE_APPS

    iops,read,158534981

    iops,write,168514545

    iops,other,1557566878

    total_latency,read,38774076988

    total_latency,write,36596756500

    total_latency,other,96023066014

Ответы [ 3 ]

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

Ответ, данный Яном, не сработал для меня, и я не думаю, что он сработает для любых дополнительных значений 'instance_name', добавленных к тексту, однако это сработало:

(?:(?<=instance_name\s)(?<value>(?:.|\s)*?)(?=instance_name\s|$))*

Объяснение (изнутри):

(?<value>(?:.|\s)*?)

Эта группа будет тем матчем, который вам нужен. Часть ?<value> может быть удалена, поскольку я добавил ее только для справки в этой документации

(?<=instance_name\s)

Соответствует, только если группе 'value' предшествует строковый литерал 'instance_name', за которым следует пробел (пробел, табуляция, символ новой строки)

(?=instance_name\s|$)

Соответствует только в том случае, если за группой 'value' следует либо строковый литерал 'instance_name', либо конец строки

(?: <all regex from above> )*

Оберните вышеуказанные условия сопоставления в новую группу без захвата, так как мы можем захотеть повторить поиск нескольких поисков 'instance_name' в строке

Надеюсь, это поможет вам:)

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

Я думаю, что вы действительно хотите здесь сделать, это просто split ваша строка:

>>> s = '''instance_name DEDUP
... 
... iops,other,1
... 
... instance_name USERSPACE_APPS
... 
... iops,read,158534981
... 
... iops,write,168514545
... 
... iops,other,1557566878
... 
... total_latency,read,38774076988
... 
... total_latency,write,36596756500
... 
... total_latency,other,96023066014
... 
... time'''
>>> s.split('instance_name')
['',
 ' DEDUP\n\niops,other,1\n\n',
 ' USERSPACE_APPS\n\niops,read,158534981\n\niops,write,168514545\n\niops,other,1557566878\n\ntotal_latency,read,38774076988\n\ntotal_latency,write,36596756500\n\ntotal_latency,other,96023066014\n\ntime']

Если вы хотите удалить пустые строки и пробелы:

>>> list(filter(bool, (chunk.strip() for chunk in s.split('instance_name'))))
['DEDUP\n\niops,other,1',
 'USERSPACE_APPS\n\niops,read,158534981\n\niops,write,168514545\n\niops,other,1557566878\n\ntotal_latency,read,38774076988\n\ntotal_latency,write,36596756500\n\ntotal_latency,other,96023066014\n\ntime']

Если instance_name в вашем конкретном случае - не фиксированная строка, а шаблон, тогда вы можете использовать re.split().

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

Измените его на

instance_name(.+?)(?=instance_name|\Z)

Это добавляет чередование (|), где \Z означает самый конец строки (отправленный с мобильного, следовательно, немного короткий).

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