Я работаю над проблемой текстового шаблона. У меня есть следующий ввод -
term = 'CG-14/0,2-L-0_2'
Мне нужно удалить все возможные пунктуации (разделители) из входного слова. В принципе мне нужен следующий вывод из входного термина -
'CG1402L02'
Я также должен хранить (в любом формате (объект, dict, кортеж и т.д.)) Разделитель и положение разделителя перед удалением разделителей.
Пример вывода (если возвращен как кортеж) -
((-,2), (/,5), (,,7), (-,9), (-,11), (_,13))
Я могу получить результат, используя следующий код python -
re.sub(r'[^\w]', '', term.replace('_', ''))
Но как сохранить разделитель и разделитель (наиболее эффективным способом) перед удалением разделителей?
Вы могли бы сделать что-то подобное, добавив все остальные разделители, которые вам нужны, в список delims
term = 'CG-14/0,2-L-0_2'
delims = ['-','/',',','_']
locations = []
pos = 0
for c in term: ##iterate through the characters in the string
if c in delims:
locations.append([c,pos]) ##store the character and its original position
pos+=1
И после этого вы re.sub
команду для их замены.
Вы можете просто ходить один раз через term
и собирать всю необходимую информацию по пути:
from string import ascii_letters,digits
term = 'CG-14/0,2-L-0_2'
# defined set of allowed characters a-zA-Z0-9
# set lookup is O(1) - fast
ok = set(digits +ascii_letters)
specials = {}
clean = []
for i,c in enumerate(term):
if c in ok:
clean.append(c)
else:
specials.setdefault(c,[])
specials[c].append(i)
cleaned = ''.join(clean)
print(clean)
print(cleaned)
print(specials)
Выход:
['C', 'G', '1', '4', '0', '2', 'L', '0', '2'] # list of characters in set ok
CG1402L02 # the ''.join()ed list
{'-': [2, 9, 11], '/': [5], ',': [7], '_': [13]} # dict of characters/positions not in ok
Увидеть:
Ты можешь использовать
specials = []
и внутри итерации:
else:
specials.append((c,i))
для получения списка кортежей вместо словаря:
[('-', 2), ('/', 5), (',', 7), ('-', 9), ('-', 11), ('_', 13)]