【发布时间】:2021-12-28 15:51:12
【问题描述】:
我有一个关于先前答案的后续问题,可以在这里找到:Split uneven string in R - variable substring and delimiters
总之,我想在一个遵循这种模式的字符串中提取粗体文本:
sp|Q2UVX4|CO3_BOVIN **Complement C3** OS=Bos taurus OX=9913 GN=**C3** PE=1 SV=2
这是 Martin Gal 提供的部分答案:
protein_name = ifelse(str_detect(string, ".*_BOVIN\\s(.*?)\\sOS=.*"),
str_replace(string, ".*_BOVIN\\s(.*?)\\sOS=.*", "\\1"),
NA_character_),
他的回答非常好,但有时我有多种物种(例如:BOVIN 和 HUMAN),所以我想让代码更灵活一点。我尝试只使用空格(\\s) 和带有空格([A-Z]\\s) 的大写字母,但第一个失败,第二个对于某些字符串不准确。然后我将 Martin 的方法与以大写字母结尾的字符串混合,旨在选择整个第一个块作为分隔符(例如:sp|Q2UVX4|CO3_BOVIN)。
到这里:
protein_name = ifelse(str_detect(string, "[a-z]{2}\\|(.*?)[A-Z]\\s(.*?)\\sOS=.*"),
str_replace(string, "[a-z]{2}\\|(.*?)[A-Z]\\s(.*?)\\sOS=.*", "\\2")
- 在这种情况下,选择两种模式之间的所有内容的最佳方法是什么?这两种模式是“sp”和大写字母后跟一个空格。
- 我使用了
(.*?),这是最好的方法吗?
【问题讨论】:
-
您所说的“最佳”是什么意思?
.*?是最简单的,但不是最快的。它不匹配换行符。 -
您不能将
string包含在问题中 -
还包括所需的输出,因为在同一个字符串中有多个 BOVIN
-
谢谢你们两位的cmets。我最好的意思是确保我使用的正则表达式对我的情况是精确的,并且不允许“误报”。例如,如果我只使用
.*,我可能会冒匹配遵循相同模式的更长字符串的风险,对吧?另外,我需要.*?周围的括号吗? @Wiktor,您链接的 regex101 太棒了。太感谢了。但是我还是看不懂[|\\w]*。你介意解释一下吗?