python 字符串仅替换保留非英文字母的特殊字符

python string replace only special characters keeping non-english alphabets

如何只从字符串中删除特殊字符,而不是外语字符。当我尝试下面的代码时,它会同时删除特殊字符和非英文字母。但是我只想去掉特殊字符(出现在正规英文句子中的特殊字符)。

import pandas as pd
from io import StringIO

data = """
id,name
1,A
1,B
1,C
1,D
2,E
2,F
2,ds
2,G
2, dsds
3,Endüstrisi`
"""
df = pd.read_csv(StringIO(data))

df['name'].str.replace('[^a-zA-Z\d\s]','',regex=True)

以上代码的结果是

0            A
1            B
2            C
3            D
4            E
5            F
6           ds
7            G
8         dsds
9    Endstrisi
Name: name, dtype: object

但我想要的是

以上代码的结果是

0            A
1            B
2            C
3            D
4            E
5            F
6           ds
7            G
8         dsds
9    Endüstrisi
Name: name, dtype: object

您可以使用

df['name'] = df['name'].str.replace(r'[^\w\s]|_', '', regex=True)

在 Python 3 中,所有正则表达式 shorthand 字符 classes(如 \w\d\s)都是 Unicode 识别的默认情况下,因为 re.U (re.UNICODE) 标志默认处于打开状态。因此,如果您在否定字符 class 中使用 \w 构造,它会匹配除任何 Unicode 字母、数字和 _.

之外的所有字符

由于您不想匹配空格,因此将 \s 添加到否定字符 class。

下划线不能包含在取反字符class中(因为那时它不会被匹配),你需要一个替代来匹配_.

所以,模式匹配

  • [^\w\s] - 除了 Unicode 字母、数字、空格和 _
  • 之外的任何字符
  • | - 或
  • _ - 下划线。