2013-12-05 2 views
0

Итак, я готовил некоторые регулярные выражения, и, кажется, библиотека регулярных выражений захватывает дополнительную новую строку, когда я использую ((.|\s)*) захватить многострочный текст .. [\S\s]* работает по какой-то причине:Python регулярное выражение захвата дополнительный символ новой строки

Если вы видите ниже, первое регулярное выражение создает дополнительную группу \n, why ??:

>>> s = """ 
... #pragma whatever 
... #pr 
... asdfsadf 
... #pragma START-SomeThing-USERCODE 
... this is the code 
... this is more 
... #pragma END-SomeThing-USERCODE 
... asd 
... asdf 
... sadf 
... sdaf 
... """ 
>>> r = r"(#pragma START-(.*)-USERCODE\s*\n)((.|\s)*)(#pragma END-(.*)-USERCODE)" 
>>> re.findall(r, s) [('#pragma START-SomeThing-USERCODE\n', 'SomeThing', 'this is the code\nthis is more\n', '\n', '#pragma END-SomeThing-USERCODE', 'SomeThing')] 
>>> r = r"(#pragma START-(.*)-USERCODE\s*\n)([\S\s]*)(#pragma END-(.*)-USERCODE)" 
>>> re.findall(r, s) [('#pragma START-SomeThing-USERCODE\n', 'SomeThing', 'this is the code\nthis is more\n', '#pragma END-SomeThing-USERCODE', 'SomeThing')] 

ответ

3

subregex

((.|\s)*) 

матчей "this is the code\nthis is more\n". Внешние круглые скобки захватывают всю эту строку.

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

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

((?:.|\s)*) 

или использовать ([\s\S]*) идиомы для согласования действительно любой символ. Это может быть хорошей идеей использовать ([\s\S]*?), хотя, чтобы убедиться, что минимально возможное количество символов соответствует.

+0

Я всегда думал, что '' (a | b) 'на самом деле означает * соответствует a или b, не захватывая его * по какой-то причине ... Слишком поздно писать для регулярного выражения , – Mazyod

-1

Это выражение производит вложенной группе

((.|\s)*) 

Поскольку вы используете вложенные скобки. Для односимвольных ИЛИ прямоугольных фигурных скобок - правильный выбор; этот синтаксис подходит, если вы хотите, чтобы выбрать между 2-х слов

(treat|trick) 
+0

Это (под-) регулярное выражение даже не присутствует в коде OP, и ни это, ни настоящее регулярное выражение не приводит к вложенному циклу. Что-то вроде '((. | \ S) *) *', но это не так. –

+1

Вы правы - больше не отвечаете после ночи в ночное время – volcano

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