Совпадение регулярных выражений только тогда, когда группа захвата встречается последней в строке

#python #regex #pandas #dataframe #contains

#python #регулярное выражение #pandas #фрейм данных #содержит

Вопрос:

У меня есть несколько строк в фрейме данных Pandas, например

 df = pd.DataFrame({'Text':['k__Bacteria|p__Actinobacteria|c__Actinobacteria|o__Bifidobacteriales|f__Bifidobacteriaceae|g__Bifidobacterium', 
'k__Bacteria|p__Actinobacteria|c__Actinobacteria|o__Bifidobacteriales|f__Bifidobacteriaceae|g__Bifidobacterium|s__Bifidobacterium_pseudolongum',
'k__Bacteria|p__Actinobacteria|c__Actinobacteria|o__Bifidobacteriales|f__Bifidobacteriaceae|g__Bifidobacterium|s__Bifidobacterium_pseudolongum|t__GCF_000421365']})
  

Я хочу вернуть совпадающие g__ в конце строки, например, используя следующее регулярное выражение:

 g__$
  

Я ожидаю получить этот результат:

 k__Bacteria|p__Actinobacteria|c__Actinobacteria|o__Bifidobacteriales|f__Bifidobacteriaceae|g__Bifidobacterium
  

Но исключите эти:

 k__Bacteria|p__Actinobacteria|c__Actinobacteria|o__Bifidobacteriales|f__Bifidobacteriaceae|g__Bifidobacterium|s__Bifidobacterium_pseudolongum
k__Bacteria|p__Actinobacteria|c__Actinobacteria|o__Bifidobacteriales|f__Bifidobacteriaceae|g__Bifidobacterium|s__Bifidobacterium_pseudolongum|t__GCF_000421365
  

Комментарии:

1. Что-то вроде "|g_.*$"

2. Используйте |g__w*$ или |g__[^|]*$ . Является ли ввод фреймом данных? Почему вы говорите «строки»?

3. Да, ввод является фреймом данных. Спасибо!

Ответ №1:

Вы можете использовать

 df = df[df['Text'].str.contains(r'|g__[^|]*$')]
  

Совпадение |g__[^|]*$ регулярных |g__ выражений, а затем ноль или более символов, отличных от | конца строки.

Смотрите демонстрацию регулярных выражений.

Тест Pandas:

 import pandas as pd
df = pd.DataFrame({'Text':['k__Bacteria|p__Actinobacteria|c__Actinobacteria|o__Bifidobacteriales|f__Bifidobacteriaceae|g__Bifidobacterium', 
'k__Bacteria|p__Actinobacteria|c__Actinobacteria|o__Bifidobacteriales|f__Bifidobacteriaceae|g__Bifidobacterium|s__Bifidobacterium_pseudolongum',
'k__Bacteria|p__Actinobacteria|c__Actinobacteria|o__Bifidobacteriales|f__Bifidobacteriaceae|g__Bifidobacterium|s__Bifidobacterium_pseudolongum|t__GCF_000421365']})
df = df[df['Text'].str.contains(r'|g__[^|]*$')]