Python pandas-正则表达式提取文本,如果找不到模式,则返回整个文本 编辑:将另一部分更新为问题
我有一个熊猫数据框“数据”,如下所示:Python pandas-正则表达式提取文本,如果找不到模式,则返回整个文本 编辑:将另一部分更新为问题,python,regex,pandas,dataframe,Python,Regex,Pandas,Dataframe,我有一个熊猫数据框“数据”,如下所示: col1 ----- sample data1(xyz) sample data2(xyz123) sample data3 sample data4 我想在上面的专栏的基础上创建一个新的专栏,它包含了在开始的论文“(”之前的文本。 但是,如果行不包含括号,则应获取原始文本 我有以下基于str.extract函数的代码: data["NewCol"] =data["col1"].str.extract("
col1
-----
sample data1(xyz)
sample data2(xyz123)
sample data3
sample data4
我想在上面的专栏的基础上创建一个新的专栏,它包含了在开始的论文“(”之前的文本。
但是,如果行不包含括号,则应获取原始文本
我有以下基于str.extract函数的代码:
data["NewCol"] =data["col1"].str.extract("(.*?)\(")
当前结果(如果找不到模式,则输入NaN):
预期结果(如果未找到模式,则应放入原始文本):
我怎样才能得到预期的结果?必须有一种方法,只需一个命令,它的python!这里需要一些帮助
注意:使用提取函数并不是必需的。如果其他函数也能做到这一点,对我来说没问题
编辑:
第二部分
对于同一个数据集,如果我想对括号之间的文本执行类似的操作,该怎么办
我的代码:
data["NewCol"] =data["col1"].str.extract("\((.*?)\)")
当前结果(如果找不到模式,则输入NaN):
预期结果(如果未找到模式,则应放入原始文本):
正则表达式可以用来解决这个问题吗?您可以
用空字符串替换后面的部分:
df['col1'].str.replace('\(.+$', '')
输出:
0 sample data1
1 sample data2
2 sample data3
3 sample data4
Name: col1, dtype: object
0
0 sample data1
1 sample data2
2 sample data3
3 sample data4
或提取开头的非(
字符:
df['col1'].str.extract("^([^\(]+)")
输出:
0 sample data1
1 sample data2
2 sample data3
3 sample data4
Name: col1, dtype: object
0
0 sample data1
1 sample data2
2 sample data3
3 sample data4
您可以用空字符串替换尾随部分:
df['col1'].str.replace('\(.+$', '')
输出:
0 sample data1
1 sample data2
2 sample data3
3 sample data4
Name: col1, dtype: object
0
0 sample data1
1 sample data2
2 sample data3
3 sample data4
或提取开头的非(
字符:
df['col1'].str.extract("^([^\(]+)")
输出:
0 sample data1
1 sample data2
2 sample data3
3 sample data4
Name: col1, dtype: object
0
0 sample data1
1 sample data2
2 sample data3
3 sample data4
使用提供的示例数据,您不需要正则表达式,而是可以使用:
使用提供的示例数据,您不需要正则表达式,而是可以使用:
这个解决方案很好,我已经为类似场景的问题增加了一个部分,但用于偏执之间的文本。你也能帮我一下吗?最简单的是用“fillna(df['col1']”链接你已经有的东西。我理解,这是有意义的。你的意思是:df[“NewCol”]=df[“col1”].str.extract(\(.*?)).fillna(df[“col1”])?这似乎不起作用。对于NaN,它将第0行上的文本从“col1”填充到两个NaN中。奇怪?两个NaN的新值都是-sample data1(xyz)这个解决方案很好,我已经为类似场景的问题增加了一个部分,但用于偏执之间的文本。你也能帮我一下吗?最简单的是用“fillna(df['col1']”链接你已经有的东西。我理解,这是有意义的。你的意思是:df[“NewCol”]=df[“col1”].str.extract(\(.*?)).fillna(df[“col1”])?这似乎不起作用。对于NaN,它将第0行上的文本从“col1”填充到两个NaN中。奇怪?两个NaN的新值都是-sample data1(xyz)。此解决方案也可以。我们是否能够使用拆分函数解决第2部分(编辑过的问题)?此解决方案也可以。我们是否能够解决第2部分(编辑问题)使用拆分功能?随着更新,您想问什么变得越来越不清楚。请尝试在每篇文章中使用一个问题,如果您必须进行大量编辑,请问一个新问题。随着更新,您想问什么变得越来越不清楚。请尝试在每篇文章中使用一个问题,如果您需要,请问一个新问题我必须做大量的修改。