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部分(编辑问题)使用拆分功能?随着更新,您想问什么变得越来越不清楚。请尝试在每篇文章中使用一个问题,如果您必须进行大量编辑,请问一个新问题。随着更新,您想问什么变得越来越不清楚。请尝试在每篇文章中使用一个问题,如果您需要,请问一个新问题我必须做大量的修改。