2016-07-27 2 views
0
(1[0-9]{2})\s+(\w+(?:-\w+)+)\s+(\w+)\s+(\w+(?:-\w+)+)\s+(\w+) 

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

123 FEX-1-80 Online N2K-C2248TP-1GE SSDFDFWFw23r23 

Как прийти это работает в regexr.com но Python 3.5.1 не может найти соответствие

r'(1[0-9]{2})\s+(\w+(?:-\w+)+)\s+(\w+)\s+(\w+(?:-\w+))' 

могут соответствовать

123 FEX-1-80 Online N2K-C2248TP 

но второй дефис в группе (4) не сопоставляется

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

ответ

0

Это регулярное выражение соответствует полной входной строки:

(1[0-9]{2})\s+(\w+(?:-\w+)+)\s+(\w+)\s+(\w+(?:-\w+)+)\s+(\w+) 

Это один не делает:

(1[0-9]{2})\s+(\w+(?:-\w+)+)\s+(\w+)\s+(\w+(?:-\w+)) 

Последнее отсутствует + после последнего не-захвата группы, и он отсутствует \s+(\w+) в конце, который соответствует SSDFDFWFw23r23 в конце входной строки.

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

Я не уверен, что я следую. На самом деле группа, не участвующая в захвате, группирует часть регулярного выражения.

(?:-\w+) или просто -\w+ оба соответствуют дефис (-), а затем один или более «слова» символов (\w+). Не имеет значения, входит ли это регулярное выражение в группу, не связанную с захватом, или нет. Если вы хотите совместить повторения этого шаблона, вы можете использовать модификатор + после группы, не связанной с захватом, например. (?:-\w+)+. Этот шаблон будет соответствовать строке, такой как -foo-bar-baz.

Итак, причина, по которой ваше второе регулярное выражение не соответствует повторяемому шаблону, состоит в том, что ему не нужен модификатор +.

0

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

(1[0-9]{2})\s+  # three digits, the first one needs to be 1 
(\w+(?:-\w+)+)\s+ # a word character (wc), followed by - and wcs 
(\w+)\s+   # another word 
(\w+(?:-\w+)+)\s+ # same expression as above 
(\w+)    # another word 

Кроме того, проверьте, если ваш (второй и четвертый) выражение можно переписать в виде [\w-]+ - это не то же самое, как ваша и будет соответствовать другим подстроки, но попытаться избегайте вложенных скобок в целом.

Что касается вашего вопроса, то вторая строка не может быть сопоставлена, поскольку вы сделали все свои выражения обязательными (а во втором примере отсутствует во втором примере, так что это не сработает).

См. a demo on regex101.com.

+0

Спасибо за ссылку, даже более мощную, чем regexr.com. '[\ w -] +', возможно, удовлетворит мою потребность, как она отличается от '\ w + (?: - \ w +) +' – sdaffa23fdsf

+0

Это совсем другое: [** first **] (https: // regex101 .com/r/bX5eR1/3) и [** second **] (https://regex101.com/r/bX5eR1/4) – Jan

Смежные вопросы