регулярное выражение python: соответствует только точке, а не букве перед ней

#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] Необходимо поместить в шаблон, не требующий использования, чтобы буквы не могли быть уничтожены при разделении, поэтому использование положительного взгляда назад является естественным решением.