仅删除列表中出现的第一个实例

时间:2020-06-02 09:05:09

标签: python regex list dataframe text

我有一个数据框,该数据框的第一列中名为“ original_column”。

我已经成功地从带有列表的文本列“ original_column”中选择了特定的单词,并将它们附加到另一列,并使用以下代码将其从原始列中删除:

list1 = {’text’ , ‘and’ , ‘example’}

finder = lambda x: next(iter([y for y in x.split() if y in list1]), None)

df['list1'] = df.original_column.apply(finder)

df['original column']=df['original column'].replace(regex=r'(?i)'+ df['list1'],value="")

我现在想在此代码的基础上,通过将列出的单词附加到新列之后,才能够从“ original_column”中删除列表中特定单词的第一个实例。

当前数据帧如下所示:

|   original column  |
__________________________
|   text text word   | 
--------------------------
|    and other and   | 

我当前的代码输出如下:

|   original column   | list1
______________________________
|        word         | text
------------------------------
|        other        |  and

我希望输出以下内容:

|   original column   | list1
_______________________________
|      text word      | text
-------------------------------
|      other and      |  and

1 个答案:

答案 0 :(得分:1)

要匹配第一个模式出现并删除它,而不必在第一次出现之前删除文本,则可以使用

^(.*?)pattern

,并将其替换为对捕获组值的后向引用,这里为 \1

您可以将list1列表中的所有单词匹配为整个单词(使用\b(?:word1|word2|wordN)\b样式),并使用(?s)^(.*?)样式匹配最不匹配的所有文字从字符串开头算起的所有字符数。

使用

df['original column'] = df['original column'].str.replace(rf"(?s)^(.*?)\b(?:{'|'.join(list1)})\b", r"\1").str.strip()

使用的正则表达式是

(?s)^(.*?)\b(?:text|and|example)\b

请参见regex demo

详细信息

  • (?s)-re.DOTALL已启用,可以让.匹配包括换行符在内的任何字符
  • ^-字符串的开头
  • (.*?)-第1组:0个或多个字符,尽可能少
  • \b(?:text|and|example)\b-字母数字单词列表中的整个单词(可能还包含一个字母)

替换为\1,即对第一个(也是此处)捕获组捕获的值的反向引用。

相关问题