2015-11-01 3 views
1

Я новичок в регулярных выражениях, и я пытаюсь написать функцию, чтобы разбивать строку на ее сокращения и знаки препинания.Regex-capture пунктуации и сокращения

Например: I'm feeling sad today.

должен возвращать список: ["I","'m","feeling","sad","today","."].

До сих пор я могу фильтровать только буквы с ([a-zA-Z])\w*, и я не уверен, как бы это сделать, чтобы включить пунктуацию.

+0

А как насчет 'чувство'? – Kasramvd

+0

Я сделал редактирование – NeptuneGamer

ответ

2
import re 

st = "I'm feeling sad today." 

li = re.findall(r'\w+|[;.,!?:]|\'\w+',st) 

['I', "'m", 'feeling', 'sad', 'today', '.'] 
+0

Есть ли все-таки сделать это с помощью findall? – NeptuneGamer

+0

@NeptuneGamer, да, я обновил сейчас с re.findall. – LetzerWille

+0

Это почти есть, но «сцепляется с m – NeptuneGamer

0

Вам нужно искать пробегов символов, которые либо только слова-символы, или ни слова-символы, ни пробелы:

>>> s = "I'm feeling sad today." 
>>> rgx = re.compile(r'(\w+|[^\w\s]+)') 
>>> rgx.findall(s) 
['I', "'", 'm', 'feeling', 'sad', 'today', '.'] 

EDIT:

Для захвата схваток, регулярное выражение должно быть более сложным. Он должен использовать утверждение look-behind, чтобы проверить, что апостроф предшествует словесному символу (иначе он будет ошибочно соответствовать цитируемым словам). Вот базовое решение:

>>> s = "I'm feeling 'sad' today." 
>>> rgx = re.compile(r"((?<=\w)'\w+|\w+|[^\w\s]+)") 
>>> rgx.findall(s) 
['I', "'m", 'feeling', "'", 'sad', "'", 'today', '.'] 

Есть некоторые краевые случаи, с которыми это не может иметь дело. Например, существуют некоторые транслитерированные иностранные слова (например, Qur'an), которые содержат встроенные апострофы. И тогда, конечно, есть такие имена, как O'Connor и их владельцы, такие как O'Connor's, а также нестандартные сокращения, такие как His 'n' Hers.

+0

Я понимаю, что это может быть неясно в вопросе, но апостроф соединен с буквой (« м »), и это сложно сгенерировать – NeptuneGamer

+0

@NeptuneGamer. Я обновил свой ответ с улучшенным решением, которое, мы надеемся, будет адекватным. – ekhumoro