Удалить пунктуацию с конца строки - PullRequest
0 голосов
/ 09 мая 2018

У меня, казалось бы, простая проблема, которую я не могу решить. Учитывая строку, содержащую DOI, мне нужно удалить последний символ, если это знак пунктуации, пока последний символ не является буквой или цифрой.

Например, если строка была:

sampleDoi = "10.1097/JHM-D-18-00044.',"

Я хочу следующий вывод:

"10.1097/JHM-D-18-00044"

т. удалить .',

Я написал следующий скрипт для этого:

invalidChars = set(string.punctuation.replace("_", ""))
a = "10.1097/JHM-D-18-00044.',"
i = -1
for each in reversed(a):
    if any(char in invalidChars for char in each):
        a = a[:i]
        i = i - 1
    else:
        print (a)
        break

Однако, это производит 10.1097/JHM-D-18-00, но я хотел бы, чтобы это произвело 10.1097/JHM-D-18-00044. Почему 44 удален с конца?

Ответы [ 4 ]

0 голосов
/ 09 мая 2018

Строковая функция rstrip() предназначена для точно этого:

>>> sampleDoi = "10.1097/JHM-D-18-00044.',"
>>> sampleDoi.rstrip(",.'")
'10.1097/JHM-D-18-00044'
0 голосов
/ 09 мая 2018

Исправленный код:

import string

invalidChars = set(string.punctuation.replace("_", ""))
a = "10.1097/JHM-D-18-00044.',"
i = -1
for each in reversed(a):
    if any(char in invalidChars for char in each):
        a = a[:i]
        i = i # Well Really this line can just be removed all together.
    else:
        print (a)
        break

Это дает желаемый результат, сохраняя при этом исходный код в основном таким же.

0 голосов
/ 09 мая 2018

Если вы не хотите использовать регулярное выражение:

the_str = "10.1097/JHM-D-18-00044.',"
while the_str[-1] in string.punctuation:
    the_str = the_str[:-1]

Удаляет последний символ, пока он не перестанет быть символом пунктуации.

0 голосов
/ 09 мая 2018

Это один из способов использования next и str.isalnum с выражением генератора, использующим enumerate / reversed.

sampleDoi = "10.1097/JHM-D-18-00044.',"

idx = next((i for i, j in enumerate(reversed(sampleDoi)) if j.isalnum()), 0)

res = sampleDoi[:-idx]

print(res)
'10.1097/JHM-D-18-00044'

Параметр по умолчанию 0 используется для того, чтобы, если алфавитно-цифровой символ не был найден, возвращалась пустая строка.

...