Python中正则表达式中的lookbehind和negative lookbehind断言紧密相连

2024-09-30 16:20:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Pandas dataframe,它有一列字符串数据,由两个由正斜杠分隔的不同部分组成。我想从字符串的“右手边”提取文本模式,但如果存在特定的字符串模式,则不需要。下面的小例子说明了这个问题。在

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']})

所以,数据帧看起来像:

^{pr2}$

我希望能够提取与rabbit相关的术语,但前提是它们出现在/分隔符的右侧,而不是{}前面有{}(有或没有中间空格)。在

我想出的正则表达式是:

rxStr = '(?P<bunny>(?<=/)(?<!jack)(?:.*rabbits?))'

…我希望任何匹配都必须以/开头,但是如果前面有jack,就不需要了。然而,它并不像我希望的那样有效。我试过很多变奏曲,但运气不好。在

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行jack rabbit匹配,尽管jackrabbit前面。在

我如何编写一个正则表达式来标识rabbit项,但前提是必须以/开头,而不是以{}开头?对于以上给出的正则表达式为何失败的任何解释也将不胜感激。在


Tags: 字符串importremanysmallpetjackrabbit
2条回答
In [52]:  myDF['pet'].str.extract(r'/(?P<bunny>(?!jack).*rabbits?.*)',expand=True)
Out[52]:
                 bunny
0                  NaN
1               rabbit
2  small fluffy rabbit
3     lop-eared rabbit
4         many rabbits
5                  NaN

RegEx explained ...

使用先行而不是后视:

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

^{pr2}$

这里,否定的lookahead意味着正斜杠后面不能跟“jack”。在

相关问题 更多 >