我有一个来自 35 家不同医院的 ID 变量,因此该变量有各种不同的排列,有时它具有相同的根 ID 号和辅助线号 - 例如 -1、/a、_1 等。
我想删除标点符号以及标点符号后面的任何内容,只留下根 ID 号。
我目前已经设法为每个不同的迭代写出单独的代码行,但我想知道是否有更优雅的方法,以便明年当数据进入时我不需要检查不同的安排?
在别人的问题上,我设法找到了一种方法来删除括号和括号内的所有文本,但我似乎无法弄清楚如何为我的目的操作它
df$patid<- gsub("\\s*\\([^\\)]+\\)","",df$patid)
我尝试了这两个代码,但没有成功
df$patid<- gsub("\\[:punct:]s*$","", df$patid)
df$patid<- gsub("\\[:alnum:]s*$","", df$patid)
我也尝试了该clean
功能,它删除了所有标点符号,但保留了后面的数字/字符,所以不是这样。
我当前代码的示例(并非所有可能的迭代) - 这些确实有效
df$patid<- gsub("\\-1$", "", df$patid)
df$patid<- gsub("\\-2$", "", df$patid)
df$patid<- gsub("\\-3$", "", df$patid)
df$patid<- gsub("\\-a$", "", df$patid)
df$patid<- gsub("\\-A$", "", df$patid)
df$patid<- gsub("\\-b$", "", df$patid)
df$patid<- gsub("\\-B$", "", df$patid)
df$patid<- gsub("\\b", "", df$patid)
df$patid<- gsub("\\/dd", "", df$patid)
不受束缚gsub
,可以接受不同的方法。
身份证号码示例
patid<- c("MB-13-169454", "MB-13-179455", "MB-13-212235.1", "MB-13-212235.2", "MB-13-224683", "570548260-2", "570548260-3", "1458629P-2", "1139093D-2", "8253015N/2", "8253015N/3", "M255858/1", "M255858/2", "8494392Q/2", "9296741B/2", "04152341421/A", "04152341421/B", "04152640475/B", "04152821164/A", "G140381883_1", "G140381883_2", "G140880774_1", "G140880774_2")
如果这个问题已经在别处得到解答,请见谅
您所描述的文字正则表达式为:
这将匹配最后一个标点符号,后跟其后的任何内容,直到字符串末尾。
您要求的是删除所有标点符号,然后删除字符串末尾的单个字母数字字符。
请参阅R 演示。
[[:punct:]][[:alnum:]]$
符合 TRE 的模式先匹配一个标点符号,然后匹配一个字母数字,然后断言该字母数字字符后是否是字符串结尾。请参阅正则表达式演示。要删除字符串末尾的任何标点符号及其后的文本,可以使用
注意:您也可以使用带函数的相同模式
stringr::str_replace_all
。此外,您必须使用perl=TRUE
ingsub
才能使此模式正常工作,因为它符合 PCRE 标准,而不是 TRE 标准。参见正则表达式演示。
细节:
[\p{S}\p{P}]+
- 一个或多个数学符号或标点符号正确字符(请注意,默认引擎使用[:punct:]
包含这两个 Unicode 类别的 POSIX 兼容版本,但正则stringr
表达式函数中使用的 ICU 正则表达式引擎不符合 POSIX 并且行为不同,这就是我建议这种模式的原因)[^\p{S}\p{P}]*
- 零个或多个除数学符号或标点符号专有字符之外的字符$
- 字符串结束。在线查看R 演示:
输出:
您可能感到困惑的其他信息: