繁体   English   中英

如何使用Python正则表达式通过不包含替代文本来提取子字符串

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM