仅删除 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)
我是 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)