[英]How to extract substring by not including alternate text using Python regex
我有以下两个字符串:
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
什么是正确的方法?
您可以使用(?=...
(?=...)
如果...
下一个匹配,则匹配,但不使用任何字符串。 这称为先行断言。 例如,仅当Isaac (?=Asimov)
后跟'Asimov'
它才会与'Isaac '
匹配。
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']
使用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
正则表达式应为
.*\/([A-Z\_0-9\.\-a-z]+)\.(?:proximal|distal)
[]
是一个位置的一组字符,必须使用圆括号。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.