#python #regex #pattern-matching
#python #регулярное выражение #сопоставление с образцом
Вопрос:
У меня есть шаблон регулярных выражений следующим образом:
r'(?:(?<!.|s)[a-z].|(?<!.|s)[A-Z].) '
и я пытаюсь изменить это, чтобы оно соответствовало только точке в конце предложений, а не букве перед ними. вот моя строка:
sent = 'This is the U.A. we have r.a.d. golden 13.56 date. a better date 34. was there.'
и вот что я сделал:
import re
re.split(r'(?:(?<!.|s)[a-z].|(?<!.|s)[A-Z].) ', sent)
однако происходит то, что он удаляет последнюю букву слов:
current output:
['This is the U.A. we have r.a.d. golden 13.56 dat',' a better date 34. was ther',
'']
мой желаемый результат:
['This is the U.A. we have r.a.d. golden 13.56 date',' a better date 34. was there',
'']
я не знаю, как я могу изменить шаблон, чтобы сохранить последнюю букву слов «дата» и «там»
Ответ №1:
Ваш шаблон может быть уменьшен и исправлен как
(?<=(?<![.s])[a-zA-Z]).
Смотрите демонстрацию регулярных выражений.
Если вам также нужно сопоставить несколько точек, поставьте их обратно
после .
.
Подробные сведения:
(?<=(?<![.s])[a-zA-Z])
— положительный взгляд назад, который соответствует местоположению, которому непосредственно предшествует(?<![.s])
— отрицательный взгляд назад, который не соответствует.
совпадению, если слева от текущего местоположения есть пробел или[a-zA-Z]
— буква ASCII
.
— буквальная точка.
Послушайте, ваш шаблон в основном представляет собой чередование двух шаблонов, (?<!.|s)[a-z].
и (?<!.|s)[A-Z].
, единственное различие между которыми — [a-z]
и [A-Z]
. Ясно, что одно и то же чередование может быть сокращено до (?<!.|s)[a-zA-Z].
[a-zA-Z]
Необходимо поместить в шаблон, не требующий использования, чтобы буквы не могли быть уничтожены при разделении, поэтому использование положительного взгляда назад является естественным решением.