Как мне сделать это заменить регулярное выражение в Python? - PullRequest
3 голосов
/ 23 июля 2010

С учетом строки текста в Python:

s = "(((((hi abc )))))))"
s = "***(((((hi abc ***&&&&"

Как заменить все неалфавитные символы, встречающиеся более 3 раз ... пустой строкой

Для всего вышеперечисленного результат должен быть:

hi abc

Ответы [ 3 ]

8 голосов
/ 23 июля 2010

Это должно работать: \W{3,}: сопоставление не алфавитно-цифровых символов, встречающихся 3 или более раз:

>>> s = "***(((((hi abc ***&&&&"
>>> re.sub("\W{3,}", "", s) 
'hi abc'
>>> s = "(((((hi abc )))))))"
>>> re.sub("\W{3,}", "", s) 
'hi abc'
4 голосов
/ 23 июля 2010

Если вы хотите заменить любую последовательность непробельных неалфавитных символов (например, '!?&', а также ваши примеры), ответ @ Stephen подойдет. Но если вы хотите заменить только последовательности из трех или более идентичных не-букв, то обратная ссылка поможет:

>>> r3 = re.compile(r'(([^\s\w])\2{2,})')
>>> r3.findall('&&&xxx!&?yyy*****')
[('&&&', '&'), ('*****', '*')]

Так, например:

>>> r3.sub('', '&&&xxx!&?yyy*****')
'xxx!&?yyy'
0 голосов
/ 23 июля 2010

Вы не можете (легко, используя регулярные выражения) заменить это на "пустую строку", которая имеет ту же длину, что и замещаемый текст. Вы можете заменить его пустой строкой "" или одним пробелом " " или любой другой константой по вашему выбору; Я использовал "*" в этом примере, чтобы было легче увидеть, что происходит.

>>> re.sub(r"(\W)\1{3,}", "*", "12345<><>aaaaa%%%11111<<<<..>>>>")
'12345<><>aaaaa%%%11111*..*'
>>>

Обратите внимание: оно не меняется "<> <>" ... Я предполагаю, что "неалфавитные символы, встречающиеся более 3 раз" означают, что должен встречаться один и тот же символ более чем в 3 раза ". Я также предполагаю, что вы имели в виду" более 3 ", а не" 3 или более ".

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