2016-05-15 10 views
3

私はこれをやろうとしている:regexesを使って単語境界で分割するにはどうすればよいですか?

import re 
sentence = "How are you?" 
print(re.split(r'\b', sentence)) 

結果は

[u'How are you?'] 

ている私は[u'How', u'are', u'you', u'?']ような何かをしたいです。これはどのように達成できますか?

+1

[Pythonは空の文字列で分割することができない(https://mail.python.org/pipermail/tutor/2003-August/024753 .html)。 –

+1

また、 '[u'How '、u' '、u'are'、u ''、u'you '、u'?']' –

+0

@KennyLauはい、正しいが、それは重要ではない、私は空白のいずれかで返されるか無視されたので、それはフィルタリングは些細なので大丈夫です。 – oarfish

答えて

7

残念ながら、Pythonは空の文字列で分割できません。

これを回避するには、splitの代わりにfindallを使用する必要があります。

実際には\bは単語境界を意味します。

(?<=\w)(?=\W)|(?<=\W)(?=\w)に相当します。意味

、次のコードは動作します:

import re 
sentence = "How are you?" 
print(re.findall(r'\w+|\W+', sentence)) 
+1

さて、OPには、空白だけのトークンは必要ありません。 –

+0

'\ b'で分割すると、空白も生成されます。なぜなら、' \ b'は長さがゼロであるからです。 –

+2

私が意味するのは、 '\ w + | [^ \ w \ s] +'がもっと適切かもしれないということです。 –

1
import re 
split = re.findall(r"[\w']+|[.,!?;]", "How are you?") 
print(split) 

出力:

['How', 'are', 'you', '?'] 

Ideone Demo

Regex101 Demo


正規表現説明:

"[\w']+|[.,!?;]" 

    1st Alternative: [\w']+ 
     [\w']+ match a single character present in the list below 
      Quantifier: + Between one and unlimited times, as many times as possible, giving back as needed [greedy] 
      \w match any word character [a-zA-Z0-9_] 
      ' the literal character ' 
    2nd Alternative: [.,!?;] 
     [.,!?;] match a single character present in the list below 
      .,!?; a single character in the list .,!?; literally 
+0

http://stackoverflow.com/a/367292/6211883 –

+0

オーダーが同じ場合でもかなり疑わしいものになります。 –

+0

なぜ '' '文字を含めましたか? – oarfish

関連する問題