Как извлечь указанные совпадения с помощью регулярного выражения в Python? - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь извлечь некоторые совпадения с помощью регулярного выражения в Python.

Вот пример списка, который у меня есть

x = ['PF13833.6', 'EF-hand_8', 'EF-hand domain pair', '34-72', 'E:1.6e-05`PF00036.32', 'EF-hand_1', 'EF hand', '48-73', 'E:1.6e-06`PF13202.6', 'EF-hand_5', 'EF hand', '49-71', 'E:0.004`PF13499.6', 'EF-hand_7', 'EF-hand domain pair', '86-148', 'E:9.6e-16`PF13405.6', 'EF-hand_6', 'EF-hand domain', '87-115', 'E:1.9e-06`PF13833.6', 'EF-hand_8', 'EF-hand domain pair', '100-148', 'E:5.2e-11`PF00036.32', 'EF-hand_1', 'EF hand', '123-149', 'E:5.5e-08`PF13202.6', 'EF-hand_5', 'EF hand', '129-148', 'E:0.00047']

А вот регулярное выражение, которое я пробовал который работал для извлечения идентификатора PF

re.findall(r'PF\d+\.\d+', str(x), re.MULTILINE|re.IGNORECASE)
['PF13833.6', 'PF00036.32', 'PF13202.6', 'PF13499.6', 'PF13405.6', 'PF13833.6', 'PF00036.32', 'PF13202.6']

Но я хочу извлечь следующее слово после матча. Например,

['PF13833.6', 'EF-hand_8', 'PF00036.32', ''EF-hand_1'' and son on..]

Как изменить шаблон для получения необходимого результата?

1 Ответ

1 голос
/ 20 марта 2020

Вы можете использовать регулярные выражения и логическое индексирование с Pandas:

import pandas as pd

# put your data in a Pandas Series
x = pd.Series(['PF13833.6', 'EF-hand_8', 'EF-hand domain pair', '34-72', 'E:1.6e-05`PF00036.32', 
               'EF-hand_1', 'EF hand', '48-73', 'E:1.6e-06`PF13202.6', 'EF-hand_5', 'EF hand', 
               '49-71', 'E:0.004`PF13499.6', 'EF-hand_7', 'EF-hand domain pair', '86-148', 
               'E:9.6e-16`PF13405.6', 'EF-hand_6', 'EF-hand domain', '87-115', 
               'E:1.9e-06`PF13833.6', 'EF-hand_8', 'EF-hand domain pair', '100-148', 
               'E:5.2e-11`PF00036.32', 'EF-hand_1', 'EF hand', '123-149', 'E:5.5e-08`PF13202.6', 
               'EF-hand_5', 'EF hand', '129-148', 'E:0.00047'])

# your regular expression for the PF ids 
PF_re = r'PF\d+\.\d+'

# find the PF ids
PF_ids = x.str.findall(PF_re)
# get rid of the lists in the result
PF_ids = PF_ids.str[0]

# create a Boolean Series to use as an index for those elements of x that contain a PF id
PF_index = x.str.contains(PF_re)
# shift this index to get an index for the next words
next_index = PF_index.shift()
# replace the resulting missing value in the first entry
next_index[0] = False

# put the results in a DataFrame and show them
results = pd.DataFrame({'PF id': list(PF_ids[PF_index]), 
                        'next word': list(x[next_index])})
display(results)

Вывод:

    PF id       next word
0   PF13833.6   EF-hand_8
1   PF00036.32  EF-hand_1
2   PF13202.6   EF-hand_5
3   PF13499.6   EF-hand_7
4   PF13405.6   EF-hand_6
5   PF13833.6   EF-hand_8
6   PF00036.32  EF-hand_1
7   PF13202.6   EF-hand_5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...