Как сопоставить все вопросительные знаки, кроме последнего - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь сопоставить все вопросительные знаки, кроме последнего в предложении. Например:

Вот первое предложение ??

Ожидаемый результат: вот первое предложение?

Вот второе предложение?

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

Вот третье предложение ???

Ожидаемый результат: вот третье предложение ??

Я попробовал следующий код, но он не работает.

re.match(r'(.*?)\?', sentence).group()

Буду признателен за любую помощь!

Ответы [ 6 ]

1 голос
/ 05 июля 2019

Попробуйте

  • жадное повторение
  • повторение вопросительного знака
  • search с group(1)

См .:

In [31]: re.search(r'([^?]*\?*)\?', 'aa???? ').group(1)
Out[31]: 'aa???'

In [32]: re.search(r'([^?]*\?*)\?', 'Here is a sentence ????? ').group(1)
Out[32]: 'Here is a sentence ????'

Демонстрация

0 голосов
/ 06 июля 2019

Используйте re.sub для удаления знака вопроса, за которым не следует знак вопроса:

re.sub(r'\?(?!\?)','',text)
0 голосов
/ 05 июля 2019

Будет работать следующее регулярное выражение.

. + (? = \?)

enter image description here

0 голосов
/ 05 июля 2019
results = re.search(r'(\w\?)', str1)
str1[0:results.span()[0]+1] + str1[results.span()[1]:]
0 голосов
/ 05 июля 2019
(.*?)\?

Проблема в ленивом квантификаторе '?'который пытается соответствовать как можно меньше, когда вы хотите, чтобы соответствовать как можно больше.Также:

.group()

вернет нулевую группу по умолчанию, что означает полное совпадение.Вам нужна первая группа:

re.match(r'(.*)\?', sentence).group(1)

Попробуйте использовать простое выражение if, если вы просто хотите удалить последний знак вопроса:

if sentence[-1] == '?':
    sentence = sentence[:-1]
0 голосов
/ 05 июля 2019

Подход Regex:

import re

s = 'Here is the third sentence???'
res = re.search(r'[^?]+\?*(?=\?)', s).group(0)
print(res)

Выход:

Here is the third sentence??

  • [^?]+ - соответствует любому ожидаемому символу (ам) ?
  • \?* - соответствует нулю или большему числу знаков вопроса. ? символ должен быть экранирован как специальный символ.
  • (?=\?) - положительное прогнозное утверждение: гарантирует, что за частью предложения, предшествующей сопоставлению, следует один ? (знак вопроса)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...