python - 在 Python 的正则表达式中与后向断言和负向后断言打结

标签 python regex pandas regex-lookarounds negative-lookbehind

我有一个 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

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

我想出的正则表达式是:

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 行中,正则表达式正确地找不到匹配项,因为没有 / 字符。但是,尽管 jackrabbit 之前,但在第 5 行 jack rabbit 匹配。

我如何编写一个正则表达式来识别 rabbit 术语,但前提是前面有 / 而不是前面有 jack?对于上面给出的正则表达式为何失败的任何解释,我们也将不胜感激。

最佳答案

使用先行而不是后行:

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”。

关于python - 在 Python 的正则表达式中与后向断言和负向后断言打结,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49214585/

相关文章:

python - 类型错误 : unsupported operand type(s) for %: 'file' and 'str'

python - 从 Python 访问 Tcl 函数的示例

mysql - rlike 表达式或替代查询中的性能?

python - 改进对 Twitter 查询的列表理解

python - zipimport.ZipImportError : can't find module from program made with py2exe

python - 如果数据帧包含在另一个数据帧中,Pandas 会从数据帧中删除该行

python - Pandas 数据框的连接列表,但忽略列名

python - pandas在ubuntu上安装错误代码1 in/tmp/pip-build-FM0q5o/pandas/

python - 根据python中的模式对字符串进行拆分和分组

javascript - 为什么正则表达式对象在 "for"循环之外分配时不起作用?JavaScript