Разделить строку с несколькими триггерами - PullRequest
0 голосов
/ 13 февраля 2020

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

  1. " accendi la luce in corridoio, spegni lalce in camera e imposta 20 in salotto "
  2. " accendi la luce в камере e cameretta, spegni la luce in corridoio "
  3. " accendi la luce in salotto "

С помощью одного регулярного выражения я должен иметь возможность подразделить каждый тип команды:

  1. (" accendi la luce in corridoio", " spegni la luce in camera e", " imposta 20 in salotto" )
  2. (" accendi la luce in camera e cameretta", " spegni la luce in corridoio")
  3. (" accendi la luce in salotto ")

Используя регулярное выражение из мой предыдущий вопрос , измененный для использования в нем, я получаю:

>>> print(re.search(r'(accendi.+)(spegni.+)(imposta.+)', "accendi la luce in corridoio, spegni la luce in camera e imposta 20 in salotto").groups())  
('accendi la luce in corridoio, ', 'spegni la luce in camera e ', 'imposta 20 in salotto')

Это нормально, но не для этих других команд:

>>> print(re.search(r'(accendi.+)(spegni.+)(imposta.+)', "accendi la luce in camera e cameretta, spegni la luce in corridoio").groups())  
Traceback (most recent call last):  
  File "<stdin>", line 1, in <module>  
AttributeError: 'NoneType' object has no attribute 'groups'  
>>> print(re.search(r'(accendi.+)(spegni.+)(imposta.+)', "accendi la luce in salotto").groups())
Traceback (most recent call last):  
  File "<stdin>", line 1, in <module>  
AttributeError: 'NoneType' object has no attribute 'groups'  

1 Ответ

0 голосов
/ 13 февраля 2020

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

(accendi(?:(?!spegni).)+)(spegni(?:(?!imposta).)+)?(imposta.+)?

(accendi         #start first group, match accendi
   (?:           #start non-capturing group
      (?!        #start negative lookahead
         spegni  #ensure the next characters aren't spegni
      )          #end negative lookahead
      .          #match any character
   )+            #end non-capturing group, repeat 1 or more times
)                #end first capture group
(spegni          #start second group, match spegni
   (?:           #start non-capturing group
      (?!        #start negative lookahead
         imposta #ensure the next characters aren't imposta
      )          #end negative lookahead
      .          #match any character
   )+            #end non-capturing group, repeat 1 or more times
)?               #end second capture group, make it optional
(imposta         #start third capture group, match imposta
   .+            #match anything 1 or more times
)?               #end third capture group, make optional
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...