用于从数据帧中提取子字符串的正则表达式模式
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*.*$)
只从结果匹配数组中取出最后一个对象。
我有一个数据框列如下:
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*.*$)
只从结果匹配数组中取出最后一个对象。