正则表达式:如果字符串以数值结尾 - 删除它,或者如果字符串以单个字母结尾 - 删除它,或者保留它

Regex: if string ends with numerical values - drop it, OR if string ends with single letter - drop it, OR leave it

这是我拥有的数据集示例:

ID Project
1 21st Townhouse 318
2 The Residences 6
3 Villanova Tower B
4 The Hills H
5 City Park

我需要转换 'Project' 列,以便:

  1. 如果一行以数值结尾,则应将其删除
  2. 如果一行以单个字母结尾,则应将其删除
  3. 否则,保持原样

这是我想要的样子:

ID Project
1 21st Townhouse
2 The Residences
3 Villanova Tower
4 The Hills
5 City Park

我试图搜索一些解决方案,并找到了这个(第一个条件只有数值):

df['Project']=df.Project[~((df.Project.astype(str).str.match("(.*\d)")) & (df.Project.astype(str).str.len() > 1))] 

它起作用了,但是,我也尝试将它应用于第二个条件:

df['Project']=df.Project[~((df.Project.astype(str).str.match("(.*\w)")) & (df.Project.astype(str).str.len() == 1))] 

但是,失败了

你能帮帮我吗? 谢谢!

您可以使用

df['Project']=df['Project'].str.replace(r'\s+(?:\d+|[A-Za-z])$', '', regex=True)

参见regex demo

详情:

  • \s+ - 一个或多个空格
  • (?:\d+|[A-Za-z]) - non-capturing 组匹配
    • \d+ - 一位或多位数字
    • | - 或
    • [A-Za-z] - ASCII 字母(使用 [^\W\d_] 匹配任何 Unicode 字母)
  • $ - 字符串结尾。

如果您的字符串在最后一个 number/letter 之前没有空格,您可以使用

df['Project'].str.replace(r'\b(?:\d+|[A-Za-z])$', '', regex=True).str.rstrip()

\b 匹配单词边界,确保在最后一个 digits/letter 之前没有字母、数字或 _.str.rstrip() 将去除尾随空格.