2016-05-15 2 views
3

Я пытаюсь сделать это:Как можно разделить границы слов с помощью регулярных выражений?

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 не может разделить пустые строки.

Чтобы обойти это, вам нужно будет использовать findall вместо split.

Фактически \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


Regex Объяснение:

"[\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

Смежные вопросы