Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 11, 2013 15:11:37

MikaMika
Зарегистрирован: 2012-11-07
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

Пара вопросов по re.sub() и регулярным выражениям.

Привет.
Не могу понять в чём разница между:

import re
re.sub(r'\s','','one\r\ntwo\nthree\r\nfive           5')
Результат:
onetwothreefive5
и
import re
re.sub(r'\s+','','one\r\ntwo\nthree\r\nfive           5')
Результат:
onetwothreefive5
В чём разница между \s и \s+

И второй вопрос.
Можно ли заменить инструкцию (которую я сейчас использую):
re.sub(r'\r\n|\r|\n| ', '', 'one\r\ntwo\nthree\r\nfive           5')
одним из предложенных выше вариантов (с “\s” или “\s+”).
Ведь они делаю одно и тоже.

Отредактировано MikaMika (Июнь 11, 2013 15:14:03)

Офлайн

#2 Июнь 11, 2013 16:14:33

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Пара вопросов по re.sub() и регулярным выражениям.

Ответы на все есть в документации
http://docs.python.org/2/library/re.html

'+'
Causes the resulting RE to match 1 or more repetitions of the preceding RE. ab+ will match ‘a’ followed by any non-zero number of ‘b’s; it will not match just ‘a’.


\s
When the UNICODE flag is not specified, it matches any whitespace character,
this is equivalent to the set [ \t\n\r\f\v].
The LOCALE flag has no extra effect on matching of the space.
If UNICODE is set, this will match the characters [ \t\n\r\f\v]
plus whatever is classified as space in the Unicode character properties database.

Офлайн

#3 Июнь 12, 2013 05:06:26

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Пара вопросов по re.sub() и регулярным выражениям.

MikaMika
В чём разница между \s и \s+
\s - это один символ
\s+ - это группа символов

документация посвежее
http://docs.python.org/3/library/re.html

MikaMika
Результат:
onetwothreefive5
результат один, но процесс его достижения различается

либо она удалит один символ, заменит его на пустоту, удалит один символ, заменит его на пустоту, …

либо она удалит группу символов, заменит её на пустоту, удалит группу символов, заменит её на пустоту, …

количество замен различается

MikaMika
Можно ли заменить инструкцию (которую я сейчас использую):
это не одно и то же
MikaMika
r'\r\n|\r|\n| '
r'[\r\n ]+'



Офлайн

#4 Июнь 12, 2013 12:12:22

MikaMika
Зарегистрирован: 2012-11-07
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

Пара вопросов по re.sub() и регулярным выражениям.

reclosedev, спасибо, прочитал в силу моего английского.
py.user.next, большое спасибо за развёрнутый ответ!

Офлайн

#5 Июнь 12, 2013 12:47:39

MikaMika
Зарегистрирован: 2012-11-07
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

Пара вопросов по re.sub() и регулярным выражениям.

Это эквивалент \s+

r'[\r\n ]+'
, а почему в документации Python, указано, что:
\s -
When the UNICODE flag is not specified, it matches any whitespace character, this is equivalent to the set . The LOCALE flag has no extra effect on matching of the space. If UNICODE is set, this will match the characters plus whatever is classified as space in the Unicode character properties database.
Получается, что \s+ - это:
r'[ \t\n\r\f\v]+'
Получается, что, например, \s - это всё же эквивалент:
re.sub(r'\r\n|\r|\n| ', '', 'one\r\ntwo\nthree\r\nfive           5')
Все символы из этого выражения (и даже больше) входят в \s
Или я что то непонимаю?

Отредактировано MikaMika (Июнь 12, 2013 12:51:16)

Офлайн

#6 Июнь 13, 2013 05:19:55

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Пара вопросов по re.sub() и регулярным выражениям.

MikaMika
Это эквивалент \s+
r'[\r\n ]+'
это не эквивалент \s+, это упрощённая запись твоего регулярного выражения

MikaMika
\s - When the UNICODE flag is not specified, it matches any whitespace character, this is equivalent to the set . The LOCALE flag has no extra effect on matching of the space. If UNICODE is set, this will match the characters plus whatever is classified as space in the Unicode character properties database.
в третьем питоне это давно уже работает по-другому: флаг re.UNICODE устарел, переход выполняется с помощью re.ASCII

MikaMika
Получается, что, например, \s - это всё же эквивалент:
нет, она прихватит ещё и табуляции, которых нет в исходном регулярном выражении



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version