Как мы можем удалить слово с повторяющимся одиночным символом? - PullRequest
3 голосов
/ 05 июня 2019

Я пытаюсь удалить слово с одинарными повторяющимися символами, используя регулярное выражение в python, например:

good => good
gggggggg => g

Что я пробовал до сих пор, так это:

re.sub(r'([a-z])\1+', r'\1', 'ffffffbbbbbbbqqq')

Проблема с вышеРешение заключается в том, что он меняет good to god, и я просто хочу удалить слова с повторяющимися символами.

Ответы [ 3 ]

3 голосов
/ 05 июня 2019

Лучшим подходом здесь является использование set

def modify(s):

    #Create a set from the string
    c = set(s)

    #If you have only one character in the set, convert set to string
    if len(c) == 1:
        return ''.join(c)
    #Else return original string
    else:
        return s

print(modify('good'))
print(modify('gggggggg'))

Если вы хотите использовать регулярное выражение, отметьте начало и конец строки в нашем регулярном выражении с помощью ^ и $ (вдохновлено комментарием @bobblebubble)

import re

def modify(s):

    #Create the sub string with a regex which only matches if a single character is repeated
    #Marking the start and end of string as well
    out = re.sub(r'^([a-z])\1+$', r'\1', s)
    return out

print(modify('good'))
print(modify('gggggggg'))

Результат будет

good
g
2 голосов
/ 05 июня 2019

Если вы не хотите использовать set в своем методе, это должно сработать:

def simplify(s):
  l = len(s)
  if l>1 and s.count(s[0]) == l:
    return s[0]
  return s

print(simplify('good'))
print(simplify('abba'))
print(simplify('ggggg'))
print(simplify('g'))
print(simplify(''))

output:

good
abba
g
g

Пояснения:

  • Вы вычисляете длину строки
  • Вы считаете количество символов, равное первому, и сравниваете число сначальная длина строки
  • в зависимости от результата, вы возвращаете первый символ или всю строку
2 голосов
/ 05 июня 2019

Вы можете использовать команду обрезки:

взгляните на следующие примеры:

"ggggggg".Trim('g');

Обновление: и для символов, находящихся в середине строки, используйте эту функцию, благодаря этому ответу

в Java:

public static string RemoveDuplicates(string input)
{
    return new string(input.ToCharArray().Distinct().ToArray());
}

на питоне:

used = set()
unique = [x for x in mylist if x not in used and (used.add(x) or True)]

но я думаю, что все эти ответы не соответствуют ситуации, как aaaaabbbbbcda, у этой строки есть конец в конце строки, который не появляется в результате (abcd). для такой ситуации используйте функции, которые я написал:

В

def unique(s):
    used = set()
    ret = list()
    s = list(s)
    for x in s:
        if x not in used:
            ret.append(x)
            used = set()

        used.add(x)

    return ret

print(unique('aaaaabbbbbcda'))

из

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