Разложить строку Python на ее символы - PullRequest
1 голос
/ 02 июня 2010

Я хочу разбить строку Python на символы.

sequenceOfAlphabets = list( string.uppercase )

работает.

Однако, почему не

sequenceOfAlphabets = re.split( '.', string.uppercase )

работа

Все, что я получаю, пусто, хотя ожидаемое количество элементов

Ответы [ 5 ]

4 голосов
/ 02 июня 2010

'.' соответствует каждому символу, а re.split возвращает все, что не было найдено, поэтому вы получаете пустой список.

Использование list обычно является способом обработки чего-то подобного, но если вы хотите использовать регулярные выражения, просто используйте re.findall

sequenceOfAlphabets = re.findall( '.', string.uppercase )

Это должно дать вам ['A', 'B', 'C', .... ,'Z']

2 голосов
/ 02 июня 2010

Поскольку символ разделителя, используемый разделителем, не появляется в результирующем списке. Это позволяет использовать его как:

re.split(',', "foo,bar,baz")
['foo', 'bar', 'baz']

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

1 голос
/ 03 июня 2010

Если вы можете что-то сделать как со встроенной функцией, так и с регулярными выражениями, то обычно встроенный подход будет быстрее и более разборчивым.

Мир регулярных выражений - это лабиринт извилистых маленьких отрывков, населенных поставщиками почти истинных понятий типа «», «The». соответствует каждому символу "" "... который он делает, но только когда вы используете флаг re.DOTALL. Эта информация не скрывается за мелким шрифтом документации; это как ПЕРВАЯ запись "специальных символов":

.
(Точка.) В режиме по умолчанию это соответствует любому символу, кроме новой строки. Если указан флаг DOTALL, он соответствует любому символу, включая символ новой строки.

>>> import re
>>> re.findall(".", "fu\nbar")
['f', 'u', 'b', 'a', 'r']
>>>
0 голосов
/ 03 июня 2010

Просто к вашему сведению, это также работает:

sequenceOfAlphabets = [a for a in string.uppercase]

... но это именно то, что делает list (), поэтому я не думаю, что это будет быстрее (я могу ошибаться).

0 голосов
/ 02 июня 2010

Из документации:

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

Также обратите внимание:

Если есть группы захвата в разделитель и соответствует в начале строки, результат начнется с пустой строкой. То же самое верно для конца строки.

Итак, вместо этого используйте re.split( '(.)', string.uppercase)[1:-1].

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