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

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

art. 3º Esta Consolidação estatui (teste 123) as normas que regulam as relações individuais. (abc 123)
PREFIX: "art. 3º"
BODY: "Esta Consolidação estatui (teste 123) as normas que regulam as relações individuais."
META: "(abc 123)"

Я подозреваю, что мне нужно что-то, связанное с прогнозом, ноне могу понять.

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

^([aA]rt\. \d+º?)(.*(?=\(.*\)))(\(.*\))?$

Вот строки, которые должны соответствовать:

art. 3º Esta Consolidação estatui as normas que regulam as relações individuais. (modificado pela lei 234/98) 
art. 3º Esta Consolidação estatui as normas que regulam as relações individuais. 
art. 3º Esta Consolidação estatui (teste 123) as normas que regulam as relações individuais. 
art. 3º Esta Consolidação estatui (teste 123) as normas que regulam as relações individuais. (abc 123)

Мои усилия в этой ссылке:https://regex101.com/r/pPlOkn/3

Мне нужно сопоставить все варианты (четыре строки): enter image description here

Ответы [ 2 ]

2 голосов
/ 30 октября 2019

Я предполагаю, что префикс заканчивается цифрой или цифрой, за которой следует 'º', за которым следуют один или несколько пробелов.

str = "art. 3º Esta Consolidação estatui (teste 123) as normas que regulam as relações individuais. (abc 123)"

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

prefix, body, meta = str.split(/(?<=º) +|\. +(?=\()/)

prefix #=> "art. 3º" 
body   #=> "Esta Consolidação estatui (teste 123)...individuais" 
meta   #=> "(abc 123)" 

Регулярное выражение гласит: «соответствовать одному или нескольким пробелам, непосредственно предшествующим 'º', или ('|')соответствует периоду, за которым следует единица или пробелы, сразу после которых следуют левые скобки. 'º' и '(', находящиеся в пределах положительного взгляда за и положительного взгляда , соответственно, не являются частьюматчей.

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

Проблема с вашим регулярным выражением состоит в том, что впереди посередине в действительности эффективно настаивает на строке, имеющей (...) в конце строки. Удалив этот упреждающий запрос и изменив необязательную группу в конце, чтобы она могла соответствовать только (...) с нет , вставляя ), она должна делать то, что вы хотите:

^([aA]rt\. \d+º?)\s*(.*?)\s*(\([^)]*\))?$

Демонстрация на regex101

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