Функция регулярного выражения 'Split' - PullRequest
3 голосов
/ 18 августа 2010

Я новичок в этом сайте и новичок в Python.

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

Я делал один из примеров «Поиск», но я изменил «Поиск» на «Разделить» и немного изменил шаблон поиска, чтобы поиграть с ним, вот строка

print re.split(r'i', 'piiig')

(обратите внимание, что в тексте 'piiig' есть 3 'i')

Выход имеет только 2 пробела, где он был разделен.

['p', '', '', 'gs']

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

Кто-нибудь знает, что происходит ???

Ответы [ 3 ]

6 голосов
/ 18 августа 2010

Ваш пример может иметь больше смысла, если вы замените i на ,:

print re.split(r',', 'p,,,g')

В этом случае четыре поля находятся через запятую, а 'p', 'g' и два пустых '' в середине.

2 голосов
/ 18 августа 2010

split удаляет найденный экземпляр.Две пустые строки - это две пустые строки между i s.

Если вы join отредактируете массив обратно, используя i в качестве разделителя, вы получите исходную строку обратно.

piiig, в этом отношении p- i - i - i -g (здесь я использую тире для пустой строки)

0 голосов
/ 18 августа 2010

Думайте об этом так ... (в Java, как я не так хорош в питоне)

String       Text     = "piiig";
List<String> Spliteds = new ArrayList<String>();
String       Match    = "";
int  I;
char c;
for (I = 0; I < Text.length; I++) {
    c = Text.charAt(I);
    if (c == 'i') {
        Spliteds.add(Match);
        Match = "";
    } else {
        Match += c;
    }
}
if (Match.length != 0)
    Spliteds.add(Match);

Итак, когда вы бежите ...

 At the end of each loop:
When: (I == 0) => c = 'p'; Match = "p"; Spliteds = {};
When: (I == 1) => c = 'i'; Match =  ""; Spliteds = {"p"};
When: (I == 2) => c = 'i'; Match =  ""; Spliteds = {"p", ""};
When: (I == 3) => c = 'i'; Match =  ""; Spliteds = {"p", "", ""};
When: (I == 4) => c = 'g'; Match = "g"; Spliteds = {"p", "", ""};
At the end of the program:
      (I == 4) => c = 'g'; Match = "g"; Spliteds = {"p", "", "", "g"};

Механизм RegEx просто находит строку между каждым 'i', и это включает пустую строку между 'i' сразу после другого 'i'.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...