我有一个看似简单的问题,我似乎解决不了这个问题。给定一个包含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从结尾被移除?
发布于 2018-05-09 16:44:37
修正代码:
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这给出了您想要的输出,同时保持了原始代码的大部分相同。
发布于 2018-05-09 16:47:24
字符串函数rstrip()正是为此设计的:
>>> sampleDoi = "10.1097/JHM-D-18-00044.',"
>>> sampleDoi.rstrip(",.'")
'10.1097/JHM-D-18-00044'发布于 2018-05-09 16:43:58
这是一种使用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,以便如果没有找到字母数字字符,则返回一个空字符串。
https://stackoverflow.com/questions/50258257
复制相似问题