在Python中使用正则表达式中的lookbehind和负向lookbehind断言打
发布时间:2020-12-20 11:02:50 所属栏目:Python 来源:网络整理
导读:我有一个Pandas数据框,它有一列字符串数据,由两个不同的部分组成,用正斜杠分隔.我想从字符串的“右侧”提取文本模式,但是如果存在特定的字符串模式则不能.以下简单的例子说明了这个问题. import numpy as npimport pandas as pdimport remyDF = pd.DataFrame
我有一个Pandas数据框,它有一列字符串数据,由两个不同的部分组成,用正斜杠分隔.我想从字符串的“右侧”提取文本模式,但是如果存在特定的字符串模式则不能.以下简单的例子说明了这个问题.
import numpy as np import pandas as pd import re myDF = pd.DataFrame({'pet':['rabbit','mammal/rabbit','mammal/small fluffy rabbit','mammal/lop-eared rabbit','mammal/many rabbits','mammal/jack rabbit']}) 所以,数据框看起来像: pet 0 rabbit 1 mammal/rabbit 2 mammal/small fluffy rabbit 3 mammal/lop-eared rabbit 4 mammal/many rabbits 5 mammal/jack rabbit 我希望能够提取与兔子相关的术语,但前提是它们出现在/分隔符的右侧,而不是兔子前面有杰克(有或没有中间空间). 我想出的正则表达式是: rxStr = '(?P<bunny>(?<=/)(?<!jack)(?:.*rabbits?))' …我希望在任何比赛之前都有/但如果先前是杰克则不需要.但是,它没有像我希望的那样起作用.我尝试过很多变化而没有任何运气. rxStr = '(?P<bunny>(?<=/)(?<!jack)(?:.*rabbits?))' rx = re.compile(rxStr,flags=re.I|re.X) rabbitDF = myDF['pet'].str.extract(rx,expand=True) myDF = myDF.join(rabbitDF) print(myDF) pet bunny 0 rabbit NaN 1 mammal/rabbit rabbit 2 mammal/small fluffy rabbit small fluffy rabbit 3 mammal/lop-eared rabbit lop-eared rabbit 4 mammal/many rabbits many rabbits 5 mammal/jack rabbit jack rabbit 在第0行中,正则表达式正确无法找到匹配项,因为没有/字符.然而,在第5行杰克兔匹配尽管杰克在兔子之前. 我怎样才能编写一个能够识别兔子术语的正则表达式,但前面只有/前面没有杰克?任何解释为什么上面给出的正则表达式失败也将非常感激. 解决方法
使用前瞻而不是lookbehind:
myDF.pet.str.extract('(?P<bunny>(?<=/)(?!jack).*rabbit)',expand=True) bunny 0 NaN 1 rabbit 2 small fluffy rabbit 3 lop-eared rabbit 4 many rabbit 5 NaN ( # capture group (?<=/) # lookbehind - forwardslash (?!jack) # negative lookahead - "jack" .* # match anything rabbit # match "rabbit" ) 在这里,负向前瞻意味着fwslash不得跟随“jack”. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |