用于从数据帧中提取子字符串的正则表达式模式

Regex pattern for extracting substring from dataframe

我有一个数据框列如下:

df['col1']

['cat-dog asd-pwr sdf', 'cat-goat asd-pwr2 sdf', 'cat asd-pwr3 sdf']

我需要提取以下内容:

['asd-pwr', 'asd-pwr2', 'asd-pwr3']

即最后一对由-

连接的子串

我尝试了以下方法:

import re
df['col1'].str.extract(r'\s[a-zA-Z]*-[a-zA-Z]*\s', flags=re.IGNORECASE)

首先,我的正则表达式构造甚至无法根据需要发现任何一对子字符串。

您可以使用:

import re

df['col1'].str.extract(r'\s*(\w+-\w+)(?!.*-)\s*', flags=re.IGNORECASE)

在这里,我们使用\w而不是[a-zA-Z],因为您还想提取pwr之后的数字。

我们还使用负前瞻 (?!.*-) 来确保当前匹配的子字符串是字符串中最后一个带有连字符 - 的子字符串。

结果:

          0
0   asd-pwr
1  asd-pwr2
2  asd-pwr3

您可以使用

import pandas as pd
df = pd.DataFrame({'col1': ['cat-dog asd-pwr sdf', 'cat-goat asd-pwr2 sdf', 'cat asd-pwr3 sdf']})
>>> df['col1'].str.extract(r'(?:.*\W)?(\w+-\w+)')
          0
0   asd-pwr
1  asd-pwr2
2  asd-pwr3

或者,如果左边可以有字符串开头或者空格,也可以使用

r'(?:.*\s)?(\w+-\w+)'

详情:

  • (?:.*\W)? - 除换行字符外的任意零个或多个字符的可选序列,尽可能多,然后是非单词字符(\s 匹配空格)
  • (\w+-\w+) - 第 1 组:一个或多个单词字符,- 和一个或多个单词字符。

由于 .* 是贪心的,圆括号之间的模式的最后部分(也称为捕获括号)获取最后一次出现的带连字符的单词。

这个正则表达式应该可以解决问题

\w*-\w*(?=(\s|$)\w*.*$)

只从结果匹配数组中取出最后一个对象。