Mam następujące dwa struny:

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

To, co chcę zrobić, to uchwycić:

BB_152.HPMSC
BB_147.HMSC-he

Dlaczego ten regex nie powiódł się:

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

Dając;

BB_152.HPMSC.distal
BB_147.HMSC-he.proximal

Jaki jest właściwy sposób?

0
pdubois 28 czerwiec 2017, 09:16

3 odpowiedzi

Najlepsza odpowiedź

Regex powinien być

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

[] jest zestawem znaków dla jednej pozycji, musisz użyć okrągłych wsporników.

1
W.Mann 28 czerwiec 2017, 06:26

Rozwiązanie przy użyciu funkcji 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)

Wyjście:

['BB_152.HPMSC', 'BB_147.HMSC-he']

  • (?=\.proximal|\.distal) - Lookhead pozytywny twierdzenie, zapewnia, że następuje kluczowa sekwencja .proximal lub .distal
1
RomanPerekhrest 28 czerwiec 2017, 06:31

Możesz użyć (?=..., aby utworzyć grupę Lookhead

(?=...)
Pasuje, jeśli ... mecze się dalej, ale nie spożywa żadnego z strunowy. Nazywa się to twierdzeniem Lookhead. Na przykład Isaac (?=Asimov) będzie pasować 'Isaac ' tylko wtedy, gdy następuje '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)

Plony

['BB_152.HPMSC', 'BB_147.HMSC-he']
2
John La Rooy 28 czerwiec 2017, 06:31