регулярное выражение для соответствия необязательным символам

#python #python-3.x #regex #re

#python #python-3.x #регулярное выражение #python-re

Вопрос:

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

cmd1 = «cmd:ifconfig: «PASS»: «Fail»: 4:2″

cmd2 = «cmd:ifconfig: «ПЕРЕДАТЬ»»

Ниже приведен мой пример кода на Python

 import re
cmd_reg = r'cmd:(.*):"(.*?)"$'
result=re.findall(cmd_reg,cmd2)
print(result)      # output -> [('ifconfig', 'PASS')] Expectation [('ifconfig', 'PASS', 'FAIL', 4, 2)]
result=re.findall(cmd_reg,cmd1)
print(result)      # output -> [] Expectation :  [('ifconfig', 'PASS', '','','')]
  

Но я не смог определить регулярное выражение, которое выдает результат, как указано в Expectation

Комментарии:

1. Что такое o/p ?

2. Что-то вроде r'cmd:([^:]*):"([^"]*)"(?::"[^"]*":(d ):")?$' ? Смотрите regex101.com/r/woD4dU/1

3. я обновил, я имел в виду o / p вместо вывода, который я обновил

Ответ №1:

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

Я считаю, что вам лучше всего

  1. сопоставьте общее выражение и зафиксируйте команду и остаток, и
  2. выполните итерацию по оставшимся группам, используя второе регулярное выражение.
 cmd_pattern = r'^cmd:([^:] ):(.*)$'
group_pattern = r'"?([^:"] )"?' # or, simpler, r'[^:] '; to retain quotes.

cmd, groups = re.match(cmd_pattern, cmd1).groups()
parsed_groups = re.findall(group_pattern, groups)
  

Для cmd2 , parsed_groups будет ['PASS'] , что, я думаю, имеет более общий смысл, чем ваш желаемый результат. Если вам нужно заполнить список пустыми элементами, вам нужно сделать это вручную.


В качестве альтернативы вы могли бы жестко запрограммировать четыре группы и сделать их необязательными:

 cmd_pattern = r'^cmd:([^:] ):([^:] )(?::([^:] ))?(?::([^:] ))?(?::([^:] ))?'
re.match(cmd_pattern, cmd1).groups()
# ('ifconfig', '"PASS"', '"Fail"', '4', '2')

re.match(cmd_pattern, cmd2).groups()
# ('ifconfig', '"PASS"', None, None, None)
  

… Я не рекомендую это. И это сложное выражение еще даже не обрабатывает необязательные кавычки, что сделало бы его еще более сложным.

Ответ №2:

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

 cmd1 = 'cmd:ifconfig:"PASS":"":4:'

cmd2 = 'cmd:ifconfig:"PASS"'

import re
cmd_reg = r'cmd:(.*):"(.*)(:"":(d):)?$'
result=re.findall(cmd_reg,cmd2)
print(result)
#output -> [('ifconfig', 'PASS')]
result=re.findall(cmd_reg,cmd1)
print(result)
#output -> []
  

вывод:

 [('ifconfig', 'PASS"', '', '')]
[('ifconfig:"PASS"', '":4:', '', '')]
  

Ответ №3:

 cmd1 = 'cmd:ifconfig:"PASS":"":4:'

cmd2 = 'cmd:ifconfig:"PASS"'

import re
cmd_reg = r'cmd:(.*):"(.*)(:"":(d):)?$'
results =re.findall(cmd_reg,str([cmd1,cmd2])
print(results)
  

Ответ №4:

Я бы предложил следующий шаблон:

 :(w*):"?(w*)"?:?"?(w*)"?:?"?(w*)"?:?"?(w*)"?
  

Вы можете попробовать приведенный выше шаблон в интерактивном режиме на следующем веб-сайте:

https://regex101.com/r/M9bf6m/2