我需要将两个合并两个数据库的某些临床试验ID的格式对齐。例如,在数据库A中,患者123访问1被存储为“ 123v01”,而在数据库B中仅存储了“ 123v1”
我可以通过grep匹配包含'v0'的那些来匹配A到B,并将尾随的零去除为'v',但是为了学术兴趣和扩展R
/ regex
技能,我想要通过仅匹配包含“ v”后跟1位数字的字符来将B反向匹配到A,因此我可以分别用前导零填充该数字。
代表:
string <- c("123v1", "123v01", "123v001")
我可以匹配在'v'之后带有> = 2位数字的字符,然后是反子集
> idx <- grepl("v(\\d{2})", string)
> string[!idx]
[1] "123v1"
但是必须有一种方法来匹配“ v”,后跟仅一个数字吗?我已经尝试过环视
# Negative look ahead "v not followed by 2+ digits"
grepl("v(?!\\d{2})", string)
# Positive look behind "single digit following v"
grepl("(?<=v)\\d{1})", string)
但是两者都返回“无效的正则表达式”错误
有什么建议吗?
答案 0 :(得分:3)
您需要在perl=TRUE
函数上设置grepl
标志。
例如
grepl("v(?!\\d{2})", string, perl=TRUE)
[1] TRUE FALSE FALSE
有关更多信息,请参见this question。
答案 1 :(得分:1)
您可以使用
grepl("v\\d(?!\\d)", string, perl=TRUE)
v\d(?!\d)
模式与v
匹配1位数字,然后确保当前位置的右边没有数字(即v
+ 1位数字之后)。 / p>
请参见regex demo。
请注意,您需要使用perl=TRUE
参数启用PCRE regex风格。