我试图找出一个正则表达式来匹配除最后一次出现的特定组之外的所有组(即括号中包含的公共名称,如果存在的话)。遗憾的是,数据的格式不是特别好,但我无法控制。你知道吗
这里是预期的输入->
预期的输出
Homo sapiens (human) -> Homo sapiens
mitochondrion Capra hircus (goat) -> mitochondrion Capra hircus
Escherichia coli -> Escherichia coli
Xenopus (Silurana) tropicalis (western tree frog) -> Xenopus (Silurana) tropicalis
我尝试了一个积极的展望,但在案例3中失败了,因为没有给出通用名称。尝试匹配([^()]*)
和捕获组0对案例4不起作用,我对尝试将匹配的组缝合在一起很谨慎,因为我不能保证括号内的学名[即'(Silurana)'
]会落在属(Xenopus)
和种(tropicalis)
之间。你知道吗
非正则表达式解决方案非常简单:
rpartition
将从字符串的末尾开始搜索,并在第一个(
返回三元组(text-before, separator, text-after)
,在本例中separator = '('
。如果字符串中没有(...)
,那么所有内容都在text-after
内,text-before
和separator
都是空字符串。 当有一个(...)
时,您将拥有text-before
中最后一个(
之前的所有文本,分隔符是(
,text-after
将是...)
。你知道吗因此
start or end
总是包含您需要的值。如果start
是非空的,您需要它,否则结果是end
。你知道吗或者:
运行示例:
时间安排:
比基于regex的解决方案快4倍以上:
filter
版本略慢于or
解决方案:See it in action
这样做的目的是要匹配一整行(括号中没有内容):
或者直到最后一个空格的所有内容,后跟括号中的内容:
你可以试试这个
(.+)(?:\(.+\))$:
查找一行末尾带有单词的括号,并匹配它前面的内容。你知道吗(.+):
匹配除换行符以外的所有字符。你知道吗然后捕获
group 1
和group 2
输出
见DEMO
相关问题 更多 >
编程相关推荐