модуль re, особенности работы
Всем привет. Есть задача: найти первое слово в строке. В строке могут встречатся точки и запятые Строка может начинаться с буквы или, к примеру, с пробела или точки. В слове может быть апостроф и он является частью слова. Весь текст может быть представлен только одним словом и все. Первое слово можеть быть представлено 1 буквой.
Используя библиотеку re успешно решил задачу(первый опыт работы с ней)
text = "_first'word second word"
result = re.search(r"[a-zA-Z]*'*[a-zA-Z]",text)
result.group()
, но появился вопрос: почему если в наведёном коде заменить первую
*
на
+
То слова которые представлены 1 буквой, не будут найдены. Спасибо.
Ответы (1 шт):
* означает, что предыдущая "сущность" (в данном случае последовательность [a-zA-Z]) может повторяться 0 и более раз. А + означает, что 1 и более раз.
Соответственно, если вы напишите +, то выражение будет интерпретироваться как:
[a-zA-Z]+- любая буква (один и более раз)'*- апостроф (ноль и более раз)[a-zA-Z]- любая буква (одна штука)
Итого, минимальная последовательность, которая будет соответствовать этому выражению:
1 + 0 + 1 = 2 символа.
Вообще, ваше выражение будет соответствовать словам, к примеру, начинающимся с апострофа, не будет находить слова с апострофом на конце. Если разбирать английские слова, то апостроф на конце вполне может быть (типа Jones’ car).
Как по мне логичнее разбирать как читаешь, т.е. сначала обязательное слово из букв, а потом не обязательные апостроф и буквы: [a-zA-Z]+'?[a-zA-Z]*. Хотя, буквально в считанных случаях слова и с апострофа могут начинаться ('cause -> because), тогда и спереди надо добавить '? чтобы сматчилось.