如何使用Python正则表达式

时间:2017-06-28 06:16:54

标签: 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

做正确的方法是什么?

3 个答案:

答案 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)

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