【问题标题】:deleting only first instance occurring in a list仅删除列表中出现的第一个实例
【发布时间】:2020-06-02 09:05:09
【问题描述】:

我有一个数据框,在名为“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

【问题讨论】:

    标签: python regex list dataframe text


    【解决方案1】:

    要匹配第一次出现的模式并将其删除而不删除第一次出现之前的文本,您可以使用

    ^(.*?)模式

    并将其替换为对捕获组值的反向引用,此处为 \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,它是对使用第一个(也是唯一的)捕获组捕获的值的反向引用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多