#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/13. я обновил, я имел в виду o / p вместо вывода, который я обновил
Ответ №1:
Пакет регулярных выражений Python не может соответствовать нескольким вхождениям данной группы, поэтому это принципиально не будет работать с одним регулярным выражением (некоторые другие реализации регулярных выражений поддерживают это, проводя различие между совпадением и захватом).
Я считаю, что вам лучше всего
- сопоставьте общее выражение и зафиксируйте команду и остаток, и
- выполните итерацию по оставшимся группам, используя второе регулярное выражение.
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*)"?
Вы можете попробовать приведенный выше шаблон в интерактивном режиме на следующем веб-сайте: