如何使用python数据帧查找正则表达式匹配的开始和结束?

如何使用python数据帧查找正则表达式匹配的开始和结束?,python,regex,pandas,Python,Regex,Pandas,我从数据库中获取DNA或蛋白质序列。序列是对齐的,所以尽管我总是知道一个输入序列,但它经常被截断,并以添加“-”字符的形式包含空格。我首先要在查询字符串中找到一个区域。在这种情况下,正则表达式搜索非常有意义。然后我想从其他对齐的字符串中提取等效区域(我在这里将它们命名为“markup”和“hit”)。因为序列是对齐的,所以我希望所有字符串中的区域都具有相同的开始和结束。是否有一种简单的方法来获取数据帧中正则表达式匹配的开始和停止 import pandas as pd import re q1,

我从数据库中获取DNA或蛋白质序列。序列是对齐的,所以尽管我总是知道一个输入序列,但它经常被截断,并以添加“-”字符的形式包含空格。我首先要在查询字符串中找到一个区域。在这种情况下,正则表达式搜索非常有意义。然后我想从其他对齐的字符串中提取等效区域(我在这里将它们命名为“markup”和“hit”)。因为序列是对齐的,所以我希望所有字符串中的区域都具有相同的开始和结束。是否有一种简单的方法来获取数据帧中正则表达式匹配的开始和停止

import pandas as pd
import re
q1,q2,q3 = 'MPIMGSSVYITVELAIAVLAILG','MPIMGSSVYITVELAIAVLAILG','MPI-MGSSVYITVELAIAVLAIL'
m1,m2,m3 = '|| ||  ||||||||||||||||','||   | ||| :|| || |:: |','||:    ::|: :||||| |:: '
h1,h2,h3 = 'MPTMGFWVYITVELAIAVLAILG','MP-NSSLVYIGLELVIACLSVAG','MPLETQDALYVALELAIAALSVA' 
#create a pandas dataframe to hold the aligned sequences
df = pd.DataFrame({'query':[q1,q2,q3],'markup':[m1,m2,m3],'hit':[h1,h2,h3]})
#create a regex search string to find the appropriate subset in the query sequence, 
desired_region_from_query = 'PIMGSS'
regex_desired_region_from_query = '(P-*I-*M-*G-*S-*S-*)'
Pandas有一个很好的提取函数,可以从查询中分割出匹配的序列:

df['query'].str.extract(regex_desired_region_from_query)
但是,我需要匹配的开始和结束,以便从标记和命中列中提取等效区域。对于单个字符串,执行以下操作:

match = re.search(regex_desired_region_from_query, df.loc[2,'query'])
sliced_hit = df.loc[2,'hit'][match.start():match.end()]
sliced_hit
Out[3]:'PLETQDA'
我目前的解决办法如下。(编辑以包含NHAHDH的建议,因此避免搜索两次。)

现在我想使用获得的开始和结束整数对字符串进行切片。 此代码将是好的:
df.sliced=df.string[df.start:df.end]

但我认为它目前不存在。相反,我再次使用了lambda函数:

#create slice functions
fn_slice_hit = lambda x : x['hit'][x['start']:x['end']]
fn_slice_markup = lambda x : x['markup'][x['start']:x['end']]

#apply the slice functions
df['sliced_markup'] = df.apply(fn_slice_markup, axis = 1)
df['sliced_hit'] = df.apply(fn_slice_hit, axis = 1)
print(df)

                       hit                   markup                    query   start  end sliced_markup sliced_hit
0  MPTMGFWVYITVELAIAVLAILG  || ||  ||||||||||||||||  MPIMGSSVYITVELAIAVLAILG       1    7        | ||       PTMGFW
1  MP-NSSLVYIGLELVIACLSVAG  ||   | ||| :|| || |:: |  MPIMGSSVYITVELAIAVLAILG       1    7        |   |      P-NSSL
2  MPLETQDALYVALELAIAALSVA  ||:    ::|: :||||| |::   MPI-MGSSVYITVELAIAVLAIL       1    8       |:    :    PLETQDA

pandas.match、.extract、.findall函数是否具有与.start()或.end()属性等效的属性?
是否有更优雅的切片方法<任何帮助都将不胜感激

我不认为这在熊猫身上存在,但这将是一个很好的补充。转到并添加新问题。说明这是您希望看到的增强功能

对于.start()和.end()方法,它们可能更适合作为extract()方法的参数。如果str.extract(pat,start_index=True),则返回开始索引的系列或数据帧,而不是捕获组的值。end_index=True也是如此。这些可能需要相互排斥

我也喜欢你的建议

df.sliced = df.string[df.start:df.end]
熊猫已经有了str.slice方法

df.sliced = df.string.str.slice(1, -1)
但这些必须是INT。在Github上添加一个单独的问题,让str.slice方法获取系列对象并应用元素


很抱歉,没有比lambda hack更好的解决方案,但正是这样的用例帮助Pandas变得更好。

我不确定这个到常规python正则表达式文档的链接是否能帮助我。问题是如何有效地查找pandas数组5000行中每个字符串的开始和停止索引。不必运行两次正则表达式来获取开始和停止索引,您可以执行
(df['start'],df['end'])=df['query']。apply(func)
其中func是一个返回开始和结束索引而不必运行正则表达式两次的函数?您能给我演示一个返回开始和结束索引而不必运行正则表达式两次的函数吗?
def(x):m=re.search(regex,x);return(m.start(),m.end())
(请相应地添加新行和选项卡)谢谢NHAHDH,我已经根据您建议的代码更新了问题。元组到列的转换还需要几行。谢谢jkitchen。问题现在在github存储库中解决。正则表达式的问题就在这里:切片的建议就在这里
df.sliced = df.string.str.slice(1, -1)