Regex не определяет «#» для удаления «#» из слов, начинающихся с «#» - PullRequest
0 голосов
/ 01 февраля 2019

Как удалить # из слов в строке, если это первый символ в слове.Он должен оставаться, если он присутствует сам по себе, в середине слова или в конце слова.

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

test = "# #DataScience"
test = re.sub(r'\b#\w\w*\b', '', test) 

для удаления# из слов, начинающихся с #, но это не работает вообще.Возвращает строку в том виде, как она есть

Может кто-нибудь сказать мне, почему # не распознается и не удаляется?

Примеры -

test - "# #DataScience"
Expected Output - "# DataScience"

Test - "kjndjk#jnjkd"
Expected Output - "kjndjk#jnjkd"

Test - "# #DataScience #KJSBDKJ kjndjk#jnjkd #jkzcjkh# iusadhuish#""
Expected Output -"# DataScience KJSBDKJ kjndjk#jnjkd jkzcjkh# iusadhuish#"

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

Попробуйте следующий шаблон.Он ищет последовательность символов «#» и пробелов, которые находятся в начале строки, и заменяет ее символом «#»

import re

test = "# #DataScience"
test = re.sub(r'(^[#\s]+)', '# ', test)

>>>test
# DataScience

. Вы можете поиграть с шаблоном далее: https://regex101.com/r/6hfw4t/1

0 голосов
/ 01 февраля 2019
a = '# #DataScience'
b = 'kjndjk#jnjkd'
c = "# #DataScience #KJSBDKJ kjndjk#jnjkd #jkzcjkh# iusadhuish#"
regex = '(\s+)#(\S)'

import re
print re.sub(regex, '\\1\\2', a)
print re.sub(regex, '\\1\\2', b)
print re.sub(regex, '\\1\\2', c)
0 голосов
/ 01 февраля 2019

Вы можете разбить вашу строку на пробел ' ', чтобы составить список всех слов в строке.Затем выполните цикл в этом списке, проверьте каждое слово для заданного условия и при необходимости замените хэш.После этого вы можете присоединиться к списку через пробел ' ', чтобы создать строку и вернуть ее.

def remove_hash(str):
    words = str.split(' ')  # Split the string into a list
    without_hash = []  # Create a list for saving the words after removing hash
    for word in words:
        if re.match('^#[a-zA-Z]+', word) is not None:  # check if the word starts with hash('#') and contains some characters after it.
            without_hash.append(word[1:])  # it true remove the hash and append it your the ther list
        else:
            without_hash.append(word)  # otherwise append the word as is in new list
    return ' '.join(without_hash)  # join the new list(without hash) by space and return it.

Вывод:

>>> remove_hash('# #DataScience')
'# DataScience'
>>> remove_hash('kjndjk#jnjkd')
'kjndjk#jnjkd'
>>> remove_hash("# #DataScience #KJSBDKJ kjndjk#jnjkd #jkzcjkh# iusadhuish#")
'# DataScience KJSBDKJ kjndjk#jnjkd jkzcjkh# iusadhuish#'

Ваш код становится короче (но немного сложнее)чтобы понять), избегая, если еще как это:

def remove_hash(str):
words = str.split(' ' )
    without_hash = []
    for word in words:
        without_hash.append(re.sub(r'^#+(.+)', r'\1', word))
    return ' '.join(without_hash)

Это даст вам те же результаты

...