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

2024-06-09 03:18:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下两个字符串:

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

正确的方法是什么


Tags: 方法字符串data原因hevariousbbproximal
3条回答

使用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

您可以使用(?=...来形成一个前瞻组

(?=...)
Matches if ... matches next, but doesn’t consume any of the string. This is called a lookahead assertion. For example, Isaac (?=Asimov) will match 'Isaac ' only if it’s followed by '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']

正则表达式应该是

.*\/([A-Z\_0-9\.\-a-z]+)\.(?:proximal|distal)

[]是一个位置的一组字符,必须使用圆括号

相关问题 更多 >