строка состоит из знаков препинания

Я хочу проверить, содержит ли строка знаки препинания или непрерывную последовательность восклицательного знака, вопроса и того и другого. Под непрерывным подразумевается более чем в 2 раза. Как и ниже,

  #If sentence contains !!!
  exc = re.compile(r"(.)\!{2}")
  word["cont_exclamation"] = if exc.search(sent[i]) else not(found)

  #If sentence contains ???
  reg = re.compile(r"(.)\?{2}")
  word["cont_question"] = if reg.search(sent[i]) else not(found)

Но теперь я хочу найти и восклицательный, и вопросительный знаки, например, привет??! или привет!! или чувак!?!

К тому же, а если я захочу? а также ! оба, но более 2 любых из них.

Я не знаю регулярное выражение должным образом, поэтому любая помощь была бы отличной.


person fscore    schedule 11.12.2013    source источник


Ответы (3)


Используйте регулярное выражение '[?!]{3,}', что означает соответствие ? или же ! символы 3 или более раз (если непрерывно = более двух раз). Внутри класса символов цитирование не требуется.

Добавьте больше знаков пунктуации в класс char по мере необходимости.

person Mark    schedule 11.12.2013
comment
А если я хочу обоих? а также ! тогда? - person fscore; 11.12.2013
comment
Это будет работать нормально () — это класс символов, который означает, что любой символ будет сопоставлен. - person Mark; 11.12.2013
comment
Не будет ли первый данный ответ также непреднамеренно соответствовать любому символу (.), за которым следует только 2 ? или же ! знаки препинания, которые не являются спецификацией? Например, я считаю, что это на самом деле соответствует Hello!! когда вы только хотите, чтобы это соответствовало Hello!!! - person Mark; 11.12.2013

попробуй re.compile(r"(.)[\?\!]{2}")

person Oliver Matthews    schedule 11.12.2013
comment
Побеги \ здесь излишни. - person Martijn Pieters; 11.12.2013
comment
А если я хочу обоих? а также ! тогда? - person fscore; 11.12.2013

regex = re.compile(r"(.)(\?|\!){2}")

edit: ввод «учебника по регулярному выражению» в Google дает больше информации, чем вам может понадобиться. Это руководство выглядит особенно хорошо сбалансированным между краткостью и полнотой.

Особенно (i.m.o.) полезные приемы, о которых часто не упоминают:

  • используйте +? и *? для переключения с жадного на ленивое совпадение. т.е. соответствовать как можно меньшему количеству символов, а не как можно большему. Пример текста: #ab# #de# --> #.*?# соответствует только #ab# (не #ab# #de#)

  • круглые скобки по умолчанию создают группу захвата. Если вы этого не хотите, вы можете использовать (?:...).

Самое главное, прокомментируйте каждое регулярное выражение удобочитаемым объяснением. Будущее-вы будете благодарны. :-)

person Torben Klein    schedule 11.12.2013
comment
это сработало как шарм. как бы я импровизировал с регулярным выражением .. любая помощь? - person fscore; 11.12.2013