我有一个看似简单的问题,我似乎无法解决。给定一个包含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
从最后删除?
答案 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)
这是使用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
,这样,如果找不到字母数字字符,则返回空字符串。