Python Условное регулярное выражение - PullRequest
3 голосов
/ 28 мая 2019

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

Объект, который дается моей программе, будет выглядеть так:

Object = """{{objectName|
parameter1=random text|
parameter2=that may or may not|
parameter3=contain any letter (well, almost)|
parameter4=this is some [[problem|problematic text]], Houston, we have a problem!|
otherParameters=(order of parameters is random, but their name is fixed)}}"""

(все параметры могут существовать или не существовать)

Я пытаюсь получить значения свойств.

В первых 3 строчках это довольно просто. простое регулярное выражение найдет его:

if "parameter1" in Object:
    parameter1 = re.split(r"parameter1=(.*?)[\|\}]", Object)[1]

if "parameter2" in Object:
    parameter2 = re.split(r"parameter2=(.*?)[\|\}]", Object)[1]

и т. Д.

Проблема с параметром 4, приведенное выше регулярное выражение (property4=(.*?)[\|\}]) вернет только this is some [[problem, поскольку регулярное выражение останавливается на вертикальной панели.

Теперь вот что: вертикальная черта будет отображаться только как часть текста внутри "[[]]".

Например, parameter1=a[[b|c]]d может появиться, но parameter1=a|bc| никогда не появится.

Мне нужно регулярное выражение, которое остановится на вертикальной черте, если оно не заключено в двойные квадратные скобки. Так, например, для параметра 4 я получу this is some [[problem|problematic text]], Houston, we have a problem!

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

По-видимому, идеального решения не существует.

Для других читателей, возможно, читающих этот вопрос в будущем, наиболее близким решением, как отметил Виктор Стрибьев в комментариях, является parameter4=([^[}|]*(?:\[\[.*?]][^[}|]*)*).

Это регулярное выражение будет работать только в том случае, если текст параметра не содержит каких-либо отдельных [, } и |, но может содержать [[...]] подстрок.

Если вы хотите понять это регулярное выражениелучше, вы можете посмотреть здесь: https://regex101.com/r/bWVvKg/2

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

Сработало здесь, когда я убрал "?":

parameter4 = re.split(r"parameter4=(.*)[\|\}]", object_)[1]

Я также изменил имя переменной на «object_», потому что «object» является встроенным объектом в Python

Best.

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