Могу ли я написать RegEx, который соответствует шаблону, и чтобы часть этого шаблона была обратным соответствием? - PullRequest
3 голосов
/ 08 октября 2019

Я хочу написать RegEx для удаления эллипсов из большого текста.

Мне нужно найти серию из двух или более точек, возможно, с пробелами между ними, возможно, без. RegEx, который я использую, находит экземпляры точек остановки, которые я не хочу удалять, поэтому я хочу, чтобы часть шаблона RegEx отменяла шаблон, если за ним следует определенная строка.

использовал этот шаблон: re.compile(r'\.[ \.]*\.')

Проблема с этим заключается в том, что в тексте присутствуют некоторые законные сокращения, которые улавливаются этим.

Возьмите этот текст, например:

1. Here are ... some . . ellipses..
2. This. . .is ellipsis also.
3. Here is an abbreviation. .i.

В приведенном выше примере я хочу, чтобы мой шаблон находил только ..., . ., .. и . . . в строках 1 и 2. Я не хочу, чтобы он что-либо находилоднако в строке 3 он найдет . ..

Я мог бы обновить RegEx, чтобы исключить шаблоны, если им предшествует или следует буква i, например: re.compile(r'[^i]\.[ \.]*\.'[^i]), но затемшаблон не найдет многоточие в строке 2.

В идеале я мог бы отрицать целую подстроку в шаблоне, чтобы он не думал, что . . является многоточием, если за ним следуетi. или ему предшествует .i, однако я не смог найтилюбой способ сделать это. Возможно ли это?

1 Ответ

2 голосов
/ 08 октября 2019

Используйте отрицательный взгляд вперед и отрицательный взгляд позади:

import re

text = """
1. Here are ... some . . ellipses..
2. This. . .is ellipsis also.
3. Here is an abbreviation. .i.
"""

pattern = re.compile(r'(?<!\.i)\.[ \.]*\.(?!i\.)')
print(pattern.findall(text))   # ['...', '. .', '..', '. . .']
print(pattern.sub('', text))

Текст после удаления . последовательность:

1. Here are  some  ellipses
2. Thisis ellipsis also.
3. Here is an abbreviation. .i.

избегать последовательности ., за которой следует i. youдолжен содержать другой символ с i для обработки этого случая:

     . . .is
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...