我有以下两个字符串:
various_data/hmsc_proximal_distal/BB_152.HPMSC.distal.tss_ext500bp.narrowPeak
various_data/hmsc_proximal_distal/BB_147.HMSC-he.proximal.tss_ext500bp.narrowPeak
我想要做的是捕获:
BB_152.HPMSC
BB_147.HMSC-he
为什么这个正则表达式失败了:
.*\/([A-Z\_0-9\.\-a-z]+)\.[proximal|distal]
通过给予;
BB_152.HPMSC.distal
BB_147.HMSC-he.proximal
做正确的方法是什么?
答案 0 :(得分:2)
您可以使用(?=...
形成前瞻组
(?=...)
匹配如果...
匹配下一个,但不消耗任何 串。这称为先行断言。例如,Isaac (?=Asimov)
只有在'Isaac '
之后才匹配'Asimov'
。
import re
s = '''
various_data/hmsc_proximal_distal/BB_152.HPMSC.distal.tss_ext500bp.narrowPeak
various_data/hmsc_proximal_distal/BB_147.HMSC-he.proximal.tss_ext500bp.narrowPeak
'''
re.findall(r"([^/]*)\.(?=proximal|distal)", s)
产量
['BB_152.HPMSC', 'BB_147.HMSC-he']
答案 1 :(得分:1)
使用re.findall()
函数的解决方案:
import re
s = '''
various_data/hmsc_proximal_distal/BB_152.HPMSC.distal.tss_ext500bp.narrowPeak
various_data/hmsc_proximal_distal/BB_147.HMSC-he.proximal.tss_ext500bp.narrowPeak
'''
result = re.findall(r'[A-Z]{2}_\d+\.[a-zA-Z-]+(?=\.proximal|\.distal)', s)
print(result)
输出:
['BB_152.HPMSC', 'BB_147.HMSC-he']
(?=\.proximal|\.distal)
- 前瞻性肯定断言,确保关键序列后跟.proximal
或.distal
答案 2 :(得分:1)
正则表达式应该是
.*\/([A-Z\_0-9\.\-a-z]+)\.(?:proximal|distal)
[]
是一个位置的一组字符,您必须使用圆括号。