2015-05-22 5 views
0

Я использую регулярные выражения в бите в python, и я немного озадачен, казалось бы, легкой проблемой. Я пытаюсь сопоставить строку вида:python regex: skip word

output wire  some_net, 

Теперь слово провод может быть там, или оно не может быть. Я также хочу, чтобы захватить слова выхода (также может быть вход) и some_net (переменное слово) Таким образом, если мы имеем следующий формат:

output wire  some_net, 

Я хочу, чтобы захватить output и some_net,

Но если мы имеем формат:

output  some_net, 

Я все еще хочу струна, чтобы соответствовать output и some_net быть захвачены.

регулярное выражение, которое я пытался это было:

re.compile(ur'^\s*(?P<io>output|input)\s+(?:wire\s+|\s+)(?P<net>\w+)', re.U), 

Но это не работает, она захватывает слово wire в тестовой строке:

output wire [2:0]    some_net,    // some comment 

На самом деле, я не» t хочу совпадение для вышеупомянутой тестовой строки (у меня есть другое регулярное выражение, чтобы справиться с этим.

Итак, есть ли способ удовлетворить эту ситуацию?

+0

вы разборе Verilog файл? – PYPL

+0

@PYPL Я действительно! Я пишу небольшой скрипт для сопоставления списков портов в файле verilog, чтобы убедиться, что они соответствуют –

+0

@AvinashRaj Я не понимаю ваш комментарий. Я знаю, что [не является символом слова. [2: 0] в тестовой строке не во всех строках. –

ответ

0
pattern = re.match("^\s*(\S+)\s+(\S+\s*(\S+)?)?\s+(\S+),.*", verilogString) 

тестирование с wire в строке

Input String: 
    output wire  some_net, 
Out: 
    pattern.group(1) = 'output' 
    pattern.group(4) = 'some_net' 

без wire в строке

Input String: 
    output some_net, 
Out: 
    pattern.group(1) = 'output' 
    pattern.group(4) = 'some_net' 

Тестирование с диапазоном провода

Input String: 
    output wire [2:0]    some_net,    // some comment 
Out: 
    pattern.group(1) = 'output' 
    pattern.group(4) = 'some_net' 
+0

Это замечательно, спасибо PYPL! Регулярное выражение, которое я закончил, это: 're.compile (ur '^ \ s * (? P output | input) (?: \ S + (? P \ w +)) + \ s * [,/$]' , re.U) 'Ключевой особенностью, которую я не рассматривал, было использование переменных сумм группы захвата. Последний скрипт был разделен здесь: https://gist.github.com/mentaal/efa142af28492acd2ed9 –

+0

@GregoryKuhn hmm can Не используйте свое регулярное выражение в последнем случае с диапазоном проводов, посмотрите: https://www.regex101.com/r/oF5jW6/1 – PYPL

+0

Спасибо за отзыв. Я, это прекрасно, я недостаточно умен, чтобы покрыть список диапазонов портов и одну сетку в одном регулярном выражении, поэтому у меня есть другое регулярное выражение для примера диапазона, который у вас есть в связанном тесте. Если вы заинтересованы, вы можете увидеть и то, и другое в предыдущем комментарии. Я на самом деле рассчитываю, что это регулярное выражение не сработает для диапазона. Кажется, этот скрипт работает для меня сейчас. –