Разница между re.split(" ", строка) и re.split("\s+", строка)?

В настоящее время я изучаю регулярные выражения и наткнулся на запрос. Итак, название вопроса - это то, что я пытаюсь выяснить. Я думал, что поскольку \s представляет собой пробел, re.split(" ", string) и re.split("\s+", string) будут давать одинаковые значения, как показано ниже:

>>> import re
>>> a = re.split(" ", "Why is this wrong")
>>> a
["Why", "is", "this", "wrong"]
>>> import re
>>> a = re.split("\s+", "Why is this wrong")
>>> a
["Why", "is", "this", "wrong"]

Эти двое дают одинаковые ответы, поэтому я подумал, что это одно и то же. Однако оказывается, что это разные вещи. В каком случае будет иначе? И что мне здесь не хватает, что ослепляет меня?

"\s+" представляет собой один или несколько любых пробелов, включая " ", "\t", "\n" и еще пару. " " — это просто пробел.
user2390182 24.12.2020 14:21

@schwobaseggl, так что \s также может представлять больше, чем просто " ", и может выражать Enter (which is equal to \n) или " ", with two space characters?

Sihwan Lee 24.12.2020 14:23

Отвечает ли это на ваш вопрос? Справочник. Что означает это регулярное выражение?

Tim Biegeleisen 24.12.2020 14:24
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
3
3 156
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Это выглядит похоже только на вашем примере.

Разбиение на ' ' (один пробел) делает именно это — оно разбивается на одно пространство. Последовательные пробелы приведут к пустым «совпадениям» при разделении.

Разделение на '\s+' также будет разделено на несколько вхождений этих символов и включает другие пробелы, а не «чистые пробелы»:

import re

a = re.split(" ", "Why    is this  \t \t  wrong")
b = re.split("\s+", "Why    is this  \t \t  wrong")

print(a)
print(b)

Выход:

# re.split(" ",data)
['Why', '', '', '', 'is', 'this', '', '\t', '\t', '', 'wrong']

# re.split("\s+",data)
['Why', 'is', 'this', 'wrong']

Документация:

\s
Соответствует любому символу пробела; это эквивалентно классу [ \t\n\r\f\v]. (https://docs.python.org/3/howto/regex.html#matching-characters)

С точки зрения кода, который вы разместили, общая идея заключается в том, что между ними нет большой разницы (с точки зрения его цели), оба собираются вывести это.

["Why", "is", "this", "wrong"]

Разница только в том, что... я бы сказал, в СПОСОБЕ того, как вы собираетесь split натягивать струну. В этом случае первый использует встроенный метод .split() в объекте str, второй использует функцию .split() из re.

Теперь этот re.split(" ", "Why is this wrong") просто разбивает строку на основе этого символа прямо здесь " " ваш первый параметр или аргумент

Теперь этот re.split("\s+", "Why is this wrong") разбивает вашу строку на основе этого регулярного выражения \s+.

Обратите внимание, что " " — это не то же самое, что \s+. Это \s+ больше похоже на значение того, что это такое, а " " в основном просто str. Вы можете узнать больше о регулярном выражении здесь.

\s+ -> Returns a match where the string contains a white space character

Я также должен сказать, что если вы хотите split строку, основанную не только на string, или вы хотите, чтобы она была больше похожа на шаблон? Тогда регулярное выражение для вас.

Имеется в виду космические символы. '\s' разделяется любыми пробелами (\b, \t, \n, \a, \r и т. д.). '+', если он следует за пробелами. Например, " \n \r  \t \v". На мой взгляд, если вам нужно использовать непосредственно строковые операции для разделения, вы должны использовать my_string.split() как стандартные методы. В противном случае вы должны использовать регулярное выражение. Потому что движок регулярных выражений имеет свою стоимость, и разработчик должен быть в состоянии ее предсказать.

Другие вопросы по теме