Pandas DataFrame - 提取两个字符串之间的字符串并包括第一个分隔符
Pandas DataFrame - Extract string between two strings and include the first delimiter
我在数据框的列中有以下字符串:
"LOCATION: FILE-ABC.txt"
"DRAFT-1-FILENAME-ADBCD.txt"
我想提取 FILE 和“.”之间的所有内容。但我想包括第一个定界符。基本上我正在尝试 return 以下结果:
"FILE-ABC"
"FILENAME-ABCD"
为此,我使用以下脚本:
df['field'] = df.string_value.str.extract('FILE/(.w+)')
但我无法return 想要的信息(总是获取 NA)。
我该怎么做?
如果字符串总是以 .txt
结尾,那么您可以尝试以下方法:
df['field'] = df['string_value'].str.extract('(FILE.*)')[0].str[:-4]
示例:
import pandas as pd
text = ["LOCATION: FILE-ABC.txt","DRAFT-1-FILENAME-ADBCD.txt"]
data = {'index':[0,1],'string_value':text}
df = pd.DataFrame(data)
df['field'] = df['string_value'].str.extract('(FILE.*)')[0].str[:-4]
输出:
index string_value field
0 0 LOCATION: FILE-ABC.txt FILE-ABC
1 1 DRAFT-1-FILENAME-ADBCD.txt FILENAME-ADBCD
你可以做一个捕获组,从(包括)'FILE'
贪婪地捕获到最后一期。或者你可以让它不贪心,所以它在 FILE.
之后的第一个 .
处停止
import pandas as pd
df = pd.DataFrame({'string_value': ["LOCATION: FILE-ABC.txt", "DRAFT-1-FILENAME-ADBCD.txt",
"BADFILENAME.foo.txt"]})
df['field_greedy'] = df['string_value'].str.extract('(FILE.*)\.')
df['field_not_greedy'] = df['string_value'].str.extract('(FILE.*?)\.')
print(df)
string_value field_greedy field_not_greedy
0 LOCATION: FILE-ABC.txt FILE-ABC FILE-ABC
1 DRAFT-1-FILENAME-ADBCD.txt FILENAME-ADBCD FILENAME-ADBCD
2 BADFILENAME.foo.txt FILENAME.foo FILENAME
您可以在正则表达式中完成这一切,而无需使用字符串切片。
df['field'] = df.string_value.str.extract('(FILE.*(?=.txt))')
- FILE 是我们开始比赛的文件
- .* 抓取任意数量的字符
- (?=) 是一个前瞻断言,匹配没有
消费。
方便的正则表达式工具 https://pythex.org/
我在数据框的列中有以下字符串:
"LOCATION: FILE-ABC.txt"
"DRAFT-1-FILENAME-ADBCD.txt"
我想提取 FILE 和“.”之间的所有内容。但我想包括第一个定界符。基本上我正在尝试 return 以下结果:
"FILE-ABC"
"FILENAME-ABCD"
为此,我使用以下脚本:
df['field'] = df.string_value.str.extract('FILE/(.w+)')
但我无法return 想要的信息(总是获取 NA)。
我该怎么做?
如果字符串总是以 .txt
结尾,那么您可以尝试以下方法:
df['field'] = df['string_value'].str.extract('(FILE.*)')[0].str[:-4]
示例:
import pandas as pd
text = ["LOCATION: FILE-ABC.txt","DRAFT-1-FILENAME-ADBCD.txt"]
data = {'index':[0,1],'string_value':text}
df = pd.DataFrame(data)
df['field'] = df['string_value'].str.extract('(FILE.*)')[0].str[:-4]
输出:
index string_value field
0 0 LOCATION: FILE-ABC.txt FILE-ABC
1 1 DRAFT-1-FILENAME-ADBCD.txt FILENAME-ADBCD
你可以做一个捕获组,从(包括)'FILE'
贪婪地捕获到最后一期。或者你可以让它不贪心,所以它在 FILE.
.
处停止
import pandas as pd
df = pd.DataFrame({'string_value': ["LOCATION: FILE-ABC.txt", "DRAFT-1-FILENAME-ADBCD.txt",
"BADFILENAME.foo.txt"]})
df['field_greedy'] = df['string_value'].str.extract('(FILE.*)\.')
df['field_not_greedy'] = df['string_value'].str.extract('(FILE.*?)\.')
print(df)
string_value field_greedy field_not_greedy
0 LOCATION: FILE-ABC.txt FILE-ABC FILE-ABC
1 DRAFT-1-FILENAME-ADBCD.txt FILENAME-ADBCD FILENAME-ADBCD
2 BADFILENAME.foo.txt FILENAME.foo FILENAME
您可以在正则表达式中完成这一切,而无需使用字符串切片。
df['field'] = df.string_value.str.extract('(FILE.*(?=.txt))')
- FILE 是我们开始比赛的文件
- .* 抓取任意数量的字符
- (?=) 是一个前瞻断言,匹配没有 消费。
方便的正则表达式工具 https://pythex.org/