簡體   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