Regex - убрать пробел между двумя знаками препинания, но не между знаком препинания и буквой - PullRequest
1 голос
/ 28 марта 2020

У меня есть следующее регулярное выражение для удаления пробелов между знаками препинания.

re.sub(r'\s*(\W)\s*', r'\1', s)

, которое отлично работает почти во всех моих тестах, кроме этого:

This is! ? a test! ?

Для что мне нужно иметь

This is!? a test!?

и получить

This is!?a test!?

Как мне НЕ убрать пробел между этими ? и 'a'? Чего мне не хватает?

Ответы [ 4 ]

2 голосов
/ 28 марта 2020

Это должно работать:

import re

str = 'This is! ? a test! ?'
res = re.sub(r'(?<=[?!])\s+(?=[?!])', '', str)
print(res)

Вывод:

This is!? a test!?

Объяснение:

(?<=[?!])   # positive lookbehind, make sure we have a punctuation before (you can add all punctuations you want to check)
\s+         # 1 or more spaces
(?=[?!])    # positive lookahead, make sure we have a punctuation after
1 голос
/ 29 марта 2020

Другим вариантом является использование модуля регулярных выражений PyPi использование \p{Punct} внутри положительных сторон для соответствия знакам препинания.

Python demo

Например,

import regex

pattern = r"(?<=\p{Punct})\s+(?=\p{Punct})"
s = 'This is! ? a test! ?'

print(regex.sub(pattern, '', s))

Вывод

This is!? a test!?

Обратите внимание, что \s также может совпадать с новой строкой. Вы также можете использовать [^\S\r\n] для сопоставления пробельных символов, кроме новых строк.

1 голос
/ 29 марта 2020

Чтобы сопоставить символ пунктуации с регулярным выражением в Python, вы можете использовать шаблон (?:[^\w\s]|_), он соответствует любому символу, кроме буквы, di git или пробела .

Таким образом, вам нужно сопоставить один или несколько пробелов (\s+), которым непосредственно предшествует знак пунктуации ((?<=[^\w\s]|_)) и сразу же следует такой символ ((?=[^\w\s]|_)) :

(?<=[^\w\s]|_)\s+(?=[^\w\s]|_)

См. онлайн-демонстрацию регулярных выражений .

Python демо :

import re
text = "This is! ? a test! ?"
print( re.sub(r"(?<=[^\w\s]|_)\s+(?=[^\w\s]|_)", "", text) )
# => This is!? a test!?
1 голос
/ 28 марта 2020

Попробуйте это:

string = "This is! ? a test! ?"
string = re.sub(r"(\W)\s*(\W)", r"\1\2", string)
print(string)

Вывод:

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