модуль re, особенности работы

Всем привет. Есть задача: найти первое слово в строке. В строке могут встречатся точки и запятые Строка может начинаться с буквы или, к примеру, с пробела или точки. В слове может быть апостроф и он является частью слова. Весь текст может быть представлен только одним словом и все. Первое слово можеть быть представлено 1 буквой.

Используя библиотеку re успешно решил задачу(первый опыт работы с ней)

text = "_first'word second word"
result = re.search(r"[a-zA-Z]*'*[a-zA-Z]",text)
result.group()

, но появился вопрос: почему если в наведёном коде заменить первую

*

на

+

То слова которые представлены 1 буквой, не будут найдены. Спасибо.


Ответы (1 шт):

Автор решения: GrAnd

* означает, что предыдущая "сущность" (в данном случае последовательность [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), тогда и спереди надо добавить '? чтобы сматчилось.

→ Ссылка