python - 正则表达式将唯一字符串提取到新列,出现错误 "look-behind requires fixed-width pattern"

标签 python regex pandas

我需要帮助将唯一字符串提取到单独的列中。

df = pd.DataFrame({'File Name':['90.12.21 / 02.05 / XO3 File Name Type', 
                                '10.22.43 / X.89 / XO20G9992 Document Internal Only',
                                'Phase 3',
                                '22.32.42.12 / 99.23 / XO2 Location Site 3: Park Triangle',
                                '38.23.99.22 / X.23 / XO28W9998 Block 4 Beach/Dock Camp',
                                '39.24.32.49 / 37.29 / Blue-print/Register Info Site (RISs)',
                                '23.21.53.32 / Q.21 / XO R9924 Location Place 5: Drive Place (Active)',
                                '   33.51.63.33 / X.21 / XO20W8812 Area Place 1: Beach Drive']}) 

这是数据框当前的样子:

| File Name                                                            |
|----------------------------------------------------------------------|
| 90.12.21 / 02.05 / XO3 File Name Type                                |
| 10.22.43 / X.89 / XO20G9992 Document Internal Only                   |
| Phase 3                                                              |
| 22.32.42.12 / 99.23 / XO2 Location Site 3: Park Triangle             |
| 38.23.99.22 / X.23 / XO28W9998 Block 4 Beach/Dock Camp               |
| 39.24.32.49 / 37.29 / Blue-print/Register Info Site (RISs)           |
| 23.21.53.32 / Q.21 / XO R9924 Location Place 5: Drive Place (Active) |
| 33.51.63.33 / X.21 / XO20W8812 Area Place 1: Beach Drive             |

这就是我需要的样子:

| File Name                              |
|----------------------------------------|
| File Name Type                         |
| Document Internal Only                 |
|                                        |
| Location Site 3: Park Triangle         |
| Block 4 Beach/Dock Camp                |
| Blue-print/Register Info Site (RISs)   |
| Location Place 5: Drive Place (Active) |
| Area Place 1: Beach Drive              |

这是我尝试的解决方案:

我知道str.extract(r'')会将正则表达式提取到新列中。我还知道在正则表达式中,“正向后查找”将从字符串末尾选择我想要的所有内容。因此,我创建了一个正向回顾正则表达式来捕获我想要的大部分字符串: https://regexr.com/4t4ll 。这仍然不是一个完美的解决方案。

但即使当我尝试使用这行代码提取我的选择时: df['File Name'].str.extract(r'((?<=\/ XO\d |XO\d[0-9]\w\d\d\d\d | XO \w\d\d\d\d ).*)') ,我收到一条错误消息:“后视需要固定宽度模式。”

我需要帮助弄清楚如何使我的正则表达式在 str.extract(r'') 中工作如何使我的正则表达式捕获出现在每个条目末尾的所有字符串?

最佳答案

您可以使用

.*\s/(?:\s+XO[A-Z0-9\s]*\b)?\s+(.+)

请参阅regex demo .

详细信息

  • .* - 除换行符之外的 0+ 个字符,尽可能多
  • \s - 空格
  • / - 一个 / 字符
  • (?:\s+XO[A-Z0-9\s]*\b)? - 可选模式:
    • \s+ - 1 个以上空格
    • XO - XO
    • [A-Z0-9\s]* - 0+ 个大写字母或数字,后跟
    • \b - 单词边界
  • \s+ - 1 个以上空格
  • (.+) - 第 1 组(str.extract 将返回什么):除换行符之外的任何 1+ 个字符,尽可能多

在 Pandas 中,使用

df['Result'] = df['File Name'].str.extract(r'.*\s/(?:\s+XO[A-Z0-9\s]*\b)?\s+(.+)', expand=False).fillna('')

结果:

                                   Result  
0  File Name Type                          
1  Document Internal Only                  
2                                          
3  Location Site 3: Park Triangle          
4  Block 4 Beach/Dock Camp                 
5  Blue-print/Register Info Site (RISs)    
6  Location Place 5: Drive Place (Active)  
7  Area Place 1: Beach Drive

关于python - 正则表达式将唯一字符串提取到新列,出现错误 "look-behind requires fixed-width pattern",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59958054/

相关文章:

python - Pandas :返回值的第一个实例和最后一个实例的索引值

Python/Pandas - 将 pandas DataFrame 划分为 10 个不相交、大小相等的子集

python - 如果 Python Pandas 中的索引相互匹配,则减去日期

python - 按组随机播放 Pandas 数据框

python - 使用 django 分页器显示项目编号。

python - 使用 Opencv 评估 tensorflow 模型失败

python - 根据列名对 Pandas 数据框中的列进行排序

regex - 捕获组的负前瞻

javascript - 正则表达式匹配单词直到空格或字符

javascript - 将数字转换为数字和量词