Получение нескольких совпадений из шаблона регулярных выражений в Python - PullRequest
1 голос
/ 25 июня 2011

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

(?:(["'])(?:\\(?:\\\\)?\1|\\\\|.)*?\1|(?:\\(?:\\\\)?\s|\\\\|\S)+)

Вот более читаемая версия этого:

(?:(["'])(?:        # Match a double or single quote followed by
     \\(?:\\\\)?\1  #   an odd number of backslashes, then the same quote
    |\\\\           #   or two backslashes
    |.              #   or anything else  
    )*?\1           # any number of times (lazily) followed by the same quote,
|(?:                # OR
     \\(?:\\\\)?\s  #   an odd number of backslashes, then whitespace
    |\\\\           #   or two backslashes
    |\S             #   or any non-whitespace
 )+                 # any number of times.
)

Я попытался поместить это в Python с помощью.findall, но вывод бессмысленный:

>>> re.findall(
... r"(?:([\"'])(?:\\(?:\\\\)?\1|\\\\|.)*?\1|(?:\\(?:\\\\)?\s|\\\\|\S)+)",
... r'the quick brown\ fox jumps "over the" lazy\\ dog')
['', '', '', '', '"', '', '']

RegexPal, с другой стороны, показывает правильный результат:

[the] [quick] [brown\ fox] [jumps] ["over the"] [lazy\\] [dog]

Я забыл отформатировать шаблон определенным образом дляPython?Или Python по-разному интерпретирует регулярные выражения?Я понятия не имею, почему единственным непустым совпадением будет двойная кавычка, и я подтвердил, что сам шаблон работает так, как должен.

1 Ответ

2 голосов
/ 25 июня 2011

Похоже, что все внутри группы без захвата. Таким образом, вы получаете совпадения, но нет соответствующего контента.

...