Разделить на \ b, когда ваш движок регулярных выражений не поддерживает его - PullRequest
4 голосов
/ 29 декабря 2008

Как разделить по границе слова в движке регулярных выражений, который его не поддерживает?

re python может совпадать с \ b, но, похоже, не поддерживает разбиение на него. Кажется, я помню, что имел дело с другими двигателями регулярных выражений, которые имели такое же ограничение.

пример ввода:

"hello, foo"

ожидаемый результат:

['hello', ', ', 'foo']

фактический вывод Python:

>>> re.compile(r'\b').split('hello, foo')
['hello, foo']

Ответы [ 5 ]

9 голосов
/ 29 декабря 2008

(\ W +) может дать ожидаемый результат:

>>> re.compile(r'(\W+)').split('hello, foo')
['hello', ', ', 'foo']
2 голосов
/ 30 декабря 2008

Для этого также можно использовать re.findall ():

>>> re.findall(r'.+?\b', 'hello, foo')
['hello', ', ', 'foo']
1 голос
/ 29 декабря 2008

Хорошо, я понял это:

Поместите шаблон разделения в захватывающих паренах и будут включены в вывод. Вы можете использовать \ w + или \ W +:

>>> re.compile(r'(\w+)').split('hello, foo')
['', 'hello', ', ', 'foo', '']

Чтобы избавиться от пустых результатов, пропустите его через filter () с None в качестве функции фильтра, которая отфильтрует все, что не оценивается как true:

>>> filter(None, re.compile(r'(\w+)').split('hello, foo'))
['hello', ', ', 'foo']

Редактировать: CMS указывает, что если вы используете \ W +, вам не нужно использовать filter ()

0 голосов
/ 29 декабря 2008

Интересно. До сих пор большинство двигателей RE, которые я пытался сделать, делят это.

Я немного поиграл и обнаружил, что re.compile(r'(\W+)').split('hello, foo') дает ожидаемый результат ... Хотя не уверен, что это надежно.

0 голосов
/ 29 декабря 2008

Попробуйте

>>> re.compile(r'\W\b').split('hello, foo')
['hello,', 'foo']

Это разделяется на несловесные слова перед границей. Вашему примеру нечего разделить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...