Как захватить все группы до и после определенного персонажа - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь захватить все группы до ;. Мне также нужно захватить последнюю группу, которая не заканчивается на ;. Вот мое утверждение и код.

регулярное выражение:

((\*|\/|\)|\(|[-+]\d+|[-+]?\d*\.\d+|\d+|\w+d?|\+|\-|=|{|}|:=|while|do|if|else|then|skip|or|and|not|>=)+;)+

утверждение:

x1:=0; x2:=1; x3:= (x1,x2,+); x4:=5; while {(x4,0,>=)} do {x4:= (x4,1,-); x1:=x2; x2:=x3; x3:= (x1, x2,+)}

Мое регулярное выражение захватывает только первую группу. Мне нужно захватить все группы, включая последнюю.

Итак, последняя группа должна быть следующей:

['x1:=0', 'x2:=1', 'x3:= (x1,x2,+)', 'x4:=5', 'while {(x4,0,>=)} do {x4:= (x4,1,-)', 'x1:=x2', 'x2:=x3', 'x3:= (x1, x2,+)']

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Два очень простых способа сделать это. Не нужно даже регулярное выражение. Вот некоторый код, показывающий две разные реализации. Требуемый шаблон:

' ?([^;]+);?'

Пример кода:

import re

statement = 'x1:=0; x2:=1; x3:= (x1,x2,+); x4:=5; while {(x4,0,>=)} do {x4:= (x4,1,-); x1:=x2; x2:=x3; x3:= (x1, x2,+)}'

#-the quick way
print('Quick way:')
print(state.split('; '))

#-the ~magic~ regex way
print('Regex way:')
pattern = ' ?([^;]+);?'
print(re.compile(pat).findall(state))

Выход:

Quick way:
['x1:=0', 'x2:=1', 'x3:= (x1,x2,+)', 'x4:=5', 'while {(x4,0,>=)} do {x4:= (x4,1,-)', 'x1:=x2', 'x2:=x3', 'x3:= (x1, x2,+)}']
Regex way:
['x1:=0', 'x2:=1', 'x3:= (x1,x2,+)', 'x4:=5', 'while {(x4,0,>=)} do {x4:= (x4,1,-)', 'x1:=x2', 'x2:=x3', 'x3:= (x1, x2,+)}']
0 голосов
/ 29 октября 2019

Похоже, вы можете просто использовать split:

ting = 'x1:=0; x2:=1; x3:= (x1,x2,+); x4:=5; while {(x4,0,>=)} do {x4:= (x4,1,-); x1:=x2; x2:=x3; x3:= (x1, x2,+)}'
ting2 = ting.split(';')
# ['x1:=0', ' x2:=1', ' x3:= (x1,x2,+)', ' x4:=5', ' while {(x4,0,>=)} do {x4:= (x4,1,-)', ' x1:=x2', ' x2:=x3', ' x3:= (x1, x2,+)}']
...