В чем проблема со следующим регулярным выражением? - PullRequest
0 голосов
/ 10 октября 2018

Я должен сгруппировать следующий оператор в 3 группы:

DFFX1 _pcpi_insn_reg_16_  ( .D(n13328), .CK(clk), .Q(pcpi_insn_16_) );
Group1: DFFX1
Group2: _pcpi_insn_reg_16_
Group3:  .D(n13328), .CK(clk), .Q(pcpi_insn_16_) 

Я использую: (.*) (.*) \((.*)\);

Вывод:

Group1: DFFX1 _pcpi_insn_reg_16_
Group2: *empty*
Group3:  .D(n13328), .CK(clk), .Q(pcpi_insn_16_) 

Не могли бы вы объяснить, почему это не работает?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Regex можно сделать более ограниченным для работы:

'(\w*)\s(\w*)\s\((.*)\)'
0 голосов
/ 10 октября 2018

Это не работает, потому что по умолчанию регулярные выражения являются жадными.Другими словами, первый .* будет потреблять столько целевого текста, сколько может, прежде чем уступить второму.Вы должны сделать свой шаблон более ограничительным, чтобы учесть это.Например:

import re

pattern = r'([\S]+) ([\S]+) \((.*)\)'
text = 'DFFX1 _pcpi_insn_reg_16_ ( .D(n13328), .CK(clk), .Q(pcpi_insn_16_) );'

m = re.match(pattern, text)
print m.groups()

Вместо сопоставления с любым символом, это соответствует только символам, которые не являются пробельными символами (это то, что делает \S).Это напечатает эти группы:

('DFFX1', '_pcpi_insn_reg_16_', ' .D(n13328), .CK(clk), .Q(pcpi_insn_16_) ')
...