仅删除 python 中列表中每个元素的开头和结尾的标点符号

Removing punctuation from only the beginning and end of each element in a list in python

我是 python(和这个社区)的新手,这是一个很久以前从 here

提出和回答的问题的分支问题

列表如下:

['hello', '...', 'h3.a', 'ds4,']

创建一个没有标点符号(并删除空元素)的新列表 x 将是:

x = [''.join(c for c in s if c not in string.punctuation) for s in x]
x = [s for s in x if s]
print(x)

输出:

['hello', 'h3a', 'ds4']

但是,我怎样才能只删除每个元素开头和结尾的所有标点符号?我的意思是,改为输出这个:

['hello', 'h3.a', 'ds4']

在这种情况下,保留 h3a 中的句点,但删除 ds4 末尾的逗号。

您可以使用正则表达式。 re.sub() 可以用字符串替换正则表达式的所有匹配项。

import re
X = ['hello', '.abcd.efg.', 'h3.a', 'ds4,']
X_rep = [re.sub(r"(^[^\w]+)|([^\w]+$)", "", x) for x in X] 
print(X_rep)
# Output: ['hello', 'abcd.efg', 'h3.a', 'ds4']

正则表达式解释:Try it

  • (^[^\w]+):
    • ^: 字符串的开头
    • [^\w]+:一个或多个non-word个字符
  • |:上一个表达式,或者下一个表达式
  • ([^\w]+$):
    • [^\w]+:一个或多个non-word个字符
    • $: 字符串结束
x = ['hello', '...', 'h3.a', 'ds4,']
x[0] = [''.join(c for c in s if c not in string.punctuation) for s in x][0]
x[(len(x)-1)] = [''.join(c for c in s if c not in string.punctuation) for s in x][(len(x)-1)]
x = [s for s in x if s]
print(x)