Библиотека регулярных выражений Python повторно считает слово, когда строка пуста

Ситуация следующая:

Со следующим фрагментом кода:

import re

content = ''
count = len(re.split('\W+', content, flags=re.UNICODE))

print(count)

# Output is expected to be 0, as it has no words
# Instead output is 1

Что происходит не так? Все остальные подсчеты слов верны.

EDIT: Это также происходит, когда мы используем строку content = '..' или content = '.!', поэтому это НЕ проблема, связанная с каким-либо смысл с функцией split() Python, но с регулярными выражениями из re.

ВАЖНОЕ ПРИМЕЧАНИЕ. Хотя решение, которое я дал, работает в моем конкретном случае, правильное решение еще не найдено. Потому что это проблема с регулярными выражениями, которая еще не РЕШЕНА НА 100%!


person CMPSoares    schedule 13.03.2015    source источник
comment
Не дубликат, потому что это независимая библиотека, и ожидается, что она вернет только слово и отфильтрует вхождение, упомянутое в другом сообщении.   -  person CMPSoares    schedule 13.03.2015
comment
как он возвращает только символы слова, где входная строка пуста?   -  person Avinash Raj    schedule 13.03.2015
comment
возможный дубликат stackoverflow.com/questions/28970724/python-split-empty- строка   -  person Avinash Raj    schedule 13.03.2015
comment
Нет @AvinashRaj, он возвращает массив с пустой строкой, когда вход представляет собой пустую строку в ссылке, которую вы упомянули, это правильно работает в функции разделения и не работает, когда строка равна "\n". Это то, что связано с функцией re.split().   -  person CMPSoares    schedule 13.03.2015
comment
Это связано с этим: docs.python.org/2/library /re.html#re.split   -  person CMPSoares    schedule 13.03.2015
comment
Это также происходит, когда используется строка '..'...   -  person CMPSoares    schedule 13.03.2015
comment
Что происходит с этим входом ..? Он плюется в соответствии с одним или несколькими символами, не являющимися словами, и, наконец, возвращает вам две пустые строки. Это работает правильно.   -  person Avinash Raj    schedule 13.03.2015
comment
Нет @AvinashRaj, это работает неправильно в рамках проблемы. Я хочу подсчитать существующие слова. Не пустые слова...   -  person CMPSoares    schedule 13.03.2015


Ответы (1)


Вот и выяснил в чем причина:

Когда используется re.split(), он разбивает строку на основе заданного регулярного выражения и возвращает массив строк. Если строка пуста и, следовательно, нечего разбивать, она, по-видимому, возвращает массив с пустой строкой в ​​нем (['']). Поэтому, когда используется функция len(), она считает массив с 1 элементом.

Решением этой проблемы является следующий фрагмент кода:

import re

content = ''
count = [len(re.split('\W+', content, flags=re.UNICODE)), 0][content == '']

print(count)

# Output is as expected, 0, by using a simple if statement
# that verifies if string is empty, when it's empty it return 0,
# otherwise, it returns the word count.
person CMPSoares    schedule 13.03.2015