You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则表达式删除以句号结尾的单词?含罗马数字后缀处理需求

解决R语言中正则处理姓名后缀的问题

问题分析

你原来的正则表达式逻辑有误,导致无法正确删除目标后缀:

  1. 最初的str_extract(x, ".*[^\\s.*\\.$]")只是去掉了后缀末尾的句号(比如把Jr.变成Jr),而非整个后缀单词——因为[^...]是字符集合,仅排除单个字符,而非匹配整个后缀结构。
  2. 尝试的罗马数字正则[^(\\s.*\\.$)|(\\sI{2}+)]完全错误:方括号内是字符集合,分组(...)和竖线|会被当作普通字符处理,根本无法匹配罗马数字后缀。

正确解决方案

使用stringr包的str_remove_all函数,直接匹配并删除末尾的两类后缀(以句号结尾的单词、罗马数字),代码如下:

library(stringr)

names <- c("John max Jr.", "manuel cortez", "samuel III", "Jameson")

# 清理后缀:匹配末尾的" 后缀."或" 罗马数字"并删除
clean_names <- str_remove_all(names, "\\s+(?:\\w+\\.|M{0,4}(?:CM|CD|D?C{0,3})(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3}))$")

# 输出结果
clean_names

运行后输出符合预期:

[1] "John max"      "manuel cortez" "samuel"        "Jameson"

正则表达式解释

  • \\s+:匹配后缀前的一个或多个空格,确保只处理末尾的后缀,不影响姓名中间的空格。
  • (?:...):非捕获分组,用来将两种后缀规则合并,避免生成额外的匹配分组。
    • \\w+\\.:匹配以句号结尾的单词(如Jr.、Sr.)。
    • M{0,4}(?:CM|CD|D?C{0,3})(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3}):匹配1-3999范围内的罗马数字,覆盖常见的后缀如II、III、IV等。
  • $:锚定到字符串末尾,确保只删除位于姓名最后的后缀。

备选:用str_extract实现

如果你坚持用str_extract,可以匹配需要保留的姓名部分,正则改为:

str_extract(names, "^.*?(?=\\s+(?:\\w+\\.|[IVXLCDM]+)$|$)")

这个正则用正向预查(?=...)判断末尾是否存在目标后缀,匹配到后缀前的部分;|$确保没有后缀的姓名能完整保留。

内容的提问来源于stack exchange,提问作者Sara Nicholson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 14:55:21