Регулярное выражение для математического выражения с оператором '=' или '! =' - PullRequest
0 голосов
/ 26 апреля 2019

Я заранее прошу прощения, если заголовок этого вопроса не является достаточно точным, я старался изо всех сил, чтобы проиллюстрировать это примером и коротким объяснением ниже:

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

name=value

name!=value

name

!name

!name=value

!name!=value

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

import re
expressionRe = re.compile( r"^(?P<name>[^=|^\!=]+)(?P<operator>(\!=|=*))(?P<value>.*)$" ) 

def showGroups( expr ):                                                                                             
   exprMatch = expressionRe.match( expr )                                                                                   
   if not exprMatch:                                                                                                
      print "no match"                                                                                             
   else:                 
      print "Name: {0}, operator: {1}, value {2}".\
         format( exprMatch.group('name'),
                 exprMatch.group('operator'),
                 exprMatch.group('value') )      

showGroups('abc!=')          
Name: abc, operator: !=, value:  

showGroups('.*=')            
Name: .*, operator: =, value:    

showGroups('.*=abc')         
Name: .*, operator: =, value: abc

showGroups('.*=val')         
Name: .*, operator: =, value: val

showGroups('=')  // this is expected
no match         

showGroups('!abc')  // this doesn't work :(
no match   

Я понимаю, что первая группа захвата не позволила первому операнду (имени) начинаться с '!', Но это самый близкий рабочий пример, который я могу продемонстрировать всем остальнымдела работают правильно.

Интересно, может ли кто-нибудь помочь мне с последней частью, получить имя, чтобы можно было начинать с '!', Без прерывания группы операторов может начинаться с '!'если за ним следует знак «=».

Заранее благодарим вас за любые советы или предложения.

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Ваш набор отрицательных символов [^=|^\!=]+ установлен неправильно. Большинство метасимволов теряют свое особое значение, когда они написаны в наборе символов. Я думаю, что вы хотите написать выражение, которое соответствует любому символу, кроме = и !, для которого достаточно написать [^=!], а также, поскольку ! не является специальным символом в регулярном выражении, вам не нужно экранировать он и экранирование внутри набора символов все равно не нужны, и после исправления ваше исправленное регулярное выражение становится следующим. Кроме того, я захватил символ ! в группе notoperator, который необязательно появляется в начале строки, и ваше последнее регулярное выражение становится таким,

^(?P<notoperator>!)?(?P<name>[^=!\n]+)(?P<operator>(!?=))?(?P<value>.*)$

Regex Demo

1 голос
/ 26 апреля 2019

Попробуйте Regex: ^(?P<not>!)?(?P<name>[^=!]+)?(?P<operator>!?=)?(?P<value>(?<==).+)?$

Демо

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