Удалить выборочные переносы / знаки препинания на основе списка исключений - PullRequest
0 голосов
/ 30 апреля 2018

Удалить выборочные переносы

import pandas as pd 
s = pd.Series(['do not-remove this-hyphen but remove-all of these-hyphens'])

list_to_keep =['not-remove', 'this-hyphen']

Я хочу сохранить перенос слов в списке «сохранить», но заменить все остальные other - ‘в серии пробелом.

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Вы можете попробовать это:

S = s.str.split(expand=True).T[0]
' '.join(np.where(S.isin(list_to_keep), S, S.str.replace('-', '')))

Выход:

'do not-remove this-hyphen but removeall of thesehyphens'

Как это работает.

  • Создайте pd.Series, S, используя строку доступа, разделите и транспонируйте. фрейм данных и получить первый столбец
  • Используйте np.where, чтобы получить только те термины, которых нет в списке, и используйте заменить, чтобы удалить дефис, в противном случае вернуть исходный термин
  • Используйте объединение, чтобы восстановить строку из терминов в обновленном pd.Series, S.
0 голосов
/ 30 апреля 2018

edit хмм ... это работает, но что-то кажется неправильным ...

Я не мастер с регулярными выражениями, но один из способов сделать это за 2 шага:

  1. Добавить - к словам, чтобы сохранить
  2. Удалить - из всего, что соответствует шаблону

Подтверждение концепции:

import pandas as pd 
s = pd.Series(['do not-remove this-hyphen but remove-all of these-hyphens'])

words_to_keep = {'not-remove', 'this-hyphen'}

p1 = '|'.join(['(?!({}))-(?=({})[.,; ])'.format(*i.split('-')) 
               for i in words_to_keep])

p2 = '(?!\w+)-(?=\w+)'

s.str.replace(p1,'--').str.replace(p2,'')[0]

Возвращает:

'do not-remove this-hyphen but removeall of thesehyphens'
0 голосов
/ 30 апреля 2018

Простое наивное решение будет:

s = 'do not-remove this-hyphen but remove-all of these-hyphens'    
words_to_keep = {'not-remove', 'this-hyphen'}

new_s = []
for word in s.split():
    if word not in words_to_keep:
        word = word.replace('-', ' ')
    new_s.append(word)

print(' '.join(new_s))  # do not-remove this-hyphen but remove all of these hyphens

Еще один подход с картой:

def unhyphen_word(word):
    return word.replace('-', ' ') if word not in words_to_keep else word

print(' '.join(map(unhyphen_word, s.split())))

или составление списка:

print(' '.join([unhyphen_word(word) for word in s.split()]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...