Сохраните разделители и разделители перед их заменой в python - PullRequest
0 голосов
/ 01 декабря 2018

Я работаю над проблемой текстового шаблона.У меня есть следующие входные данные -

term = 'CG-14/0,2-L-0_2'

Мне нужно удалить все возможные знаки препинания (разделители) из входного термина.В основном мне нужен следующий вывод из входного термина -

'CG1402L02'

Мне также нужно сохранить (в любом формате (объект, dict, кортеж и т. Д.)) Разделитель и положение разделителя перед удалениемразделители.

Пример вывода (если возвращается как кортеж) -

((-,2), (/,5), (,,7), (-,9), (-,11), (_,13))

Я могу получить вывод, используя следующий код Python -

re.sub(r'[^\w]', '', term.replace('_', ''))

Нокак сохранить разделитель и положение разделителя (наиболее эффективным способом) перед удалением разделителей?

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Вы можете просто пройти один раз через 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)]
0 голосов
/ 01 декабря 2018

Вы можете сделать что-то подобное, добавив в список любые другие разделители, которые вам нужны 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, чтобы заменить их.

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