从字符串末尾删除标点项

时间:2018-05-09 16:39:44

标签: python string punctuation

我有一个看似简单的问题,我似乎无法解决。给定一个包含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从最后删除?

3 个答案:

答案 0 :(得分:4)

字符串函数rstrip()旨在完全这个:

>>> sampleDoi = "10.1097/JHM-D-18-00044.',"
>>> sampleDoi.rstrip(",.'")
'10.1097/JHM-D-18-00044'

答案 1 :(得分:1)

更正后的代码:

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

这可以提供您想要的输出,同时保持原始代码大致相同。

答案 2 :(得分:0)

这是使用nextstr.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,这样,如果找不到字母数字字符,则返回空字符串。