2017-09-22 10 views
0

に複数の空白を確認し、私は、文字列が複数の空白が含まれているかどうかを確認するために、この機能を使用しています:のPython - 文字列

def check_multiple_white_spaces(text): 
    return " " in text 

、それは通常、この次のコードでは罰金ではなく働いている。

from bs4 import BeautifulSoup 
from string import punctuation 

text = "<p>Hello &nbsp; &nbsp; &nbsp;world!!</p>\r\n\r" 

text = BeautifulSoup(text, 'html.parser').text 
text = ''.join(ch for ch in text if ch not in set(punctuation)) 
text = text.lower().replace('\n', ' ').replace('\t', '').replace('\r', '') 

print check_multiple_white_spaces(text) 

変数textの最終値はhello      worldですが、check_multiple_white_spaces関数がTrueの代わりにFalseを返す理由がわかりません。

どうすればこの問題を解決できますか?

+1

があなたの後に...何 'プリント(のrepr(テキスト))'のショーを見てくださいスープを介して実行してください –

答えて

2

あなたがrepr()を使用してtextの内容を印刷した場合、あなたはそれが2つの連続するスペースが含まれていないことがわかります。その結果

'hello \xa0 \xa0 \xa0world ' 

を、あなたの機能が正しくFalseを返しますが。これは、空間に非休憩スペースを変換することによって固定することができます

text = text.replace(u'\xa0', u' ') 
0

まず、あなたの関数check_multiple_white_spacesを3つの空白以上があるかもしれないように、複数の空白がある場合は、実際に確認することはできません。

re.search(r"\s{2,}", text)を使用してください。

第2に、textを印刷すると、テキストをエスケープする必要があることがわかります。

この回答を参照してください。

How do I unescape HTML entities in a string in Python 3.1?

+0

それはPython 2.xの質問です。すべてのUnicode空白文字を '\ s'にマッチさせるには、' re.UNICODE'を 're.search'メソッドに渡す必要があります。 –

+0

@WiktorStribiżewあなたが正しいです、私はpython3に長い間移行されています。申し訳ありません。 – Sraw

0

text変数には連続したスペースがcheck_multiple_white_spaces関数がFalse値を返す理由です、ありません。

>>> text 
u'hello \xa0 \xa0 \xa0world ' 
>>> print text 
hello      world 

\xa0ノーブレークスペース、非破壊可能なスペース(NBSP)、ハードスペースです。 バリューOSのスペースは32と非ブレークスペースの値である160

(u' ', 32) 
(u'\xa0', 160) 

文字\ XA0はNO-BREAKのSPACE、そしてもちろん、通常のスペースとなり、最も近いASCIIと同等です。最も近いASCIIにすべての非ASCII文字を変換する

使用unidecode module同等

はデモ:

>>> import unidecode 
>>> unidecode.unidecode(text) 
'hello  world ' 
>>> " " in unidecode.unidecode(text) 
True