首页 > 解决方案 > Python - 如何删除子字符串中的所有字符,包括关键字

问题描述

我在一列的数据框中有一个相当大的语料库(500k 新文章)。大多数(但不是全部)文章的开头都有各种随机丢弃的文字,直到短语“(路透社)-”

我尝试了以下正则表达式的各种排列,试图一次调整整个列,但没有运气,因为它要么删除了文章的大块,要么什么都不做。

r = re.compile(r'\A\b.*[Reuters]\b')
reuters3 = reuters2['story_text'].str.replace(r,'', regex=True)

关于如何从正则表达式和熊猫方法的角度最好地解决这个问题的任何想法?谢谢你

下面提供了一个示例,显示要在开头删除的文本的一般模式(直到并包括(路透社)-),保持在中间摆脱并在最后摆脱(后面的所有内容,包括(编辑...). 确切的语言、字符和长度在这些关键切断词之外的文章中差异很大。

Chris Scicluna 瓦莱塔,1 月 1 日(路透社)——周二午夜时分,地中海岛屿马耳他成为欧元区最小的成员......[多行文章文本]......公共信息运动已经获得广泛认可的成功。(Michael Winfrey 编辑)((gavin.jones@reuters.com;+39-06-8522-4232;路透社消息:gavin.jones.reuters.com@reuters.net))关键词:欧洲央行扩张/欧元马耳他

标签: pythonregexpandastext

解决方案


如果你需要保留这个词,你可以使用

reuters2['story_text'].str.replace(r'(?s)^.*?(?=\(Reuters\)\s*-)', '')

如果你不需要保留这个词,你可以使用

reuters2['story_text'].str.replace(r'(?s)^.*?\(Reuters\)\s*-\s*', '')

或者,Series.str.split像这样使用:

import pandas as pd
df = pd.DataFrame({'story_text':['Some rubbish ... (Reuters) - Text']})
df['story_text'].str.split(r'\(Reuters\)\s*-', n=1).str[-1]
# => 0     Text

细节

  • (?s)- 使.匹配任何字符的 DOTALL 修饰符
  • ^- 字符串的开头
  • .*?- 尽可能少的任何 0 个或更多字符
  • \(Reuters\)- 文字(Reuters)文本
  • (?=\(Reuters\)\s*-)- 与紧随其后的位置匹配的正向前瞻,(Reuters)0+ 空格和-
  • \s*-\s*--包含 0+ 个空格。

请参阅正则表达式演示 #1正则表达式演示 #2

split解决方案是使用更简单的正则表达式,并将\(Reuters\)\s*-字符串拆分为 2 部分(因为n=1已定义,n是拆分的数量)并.str[-1]获取最后一个(此处为第二个)项目。


推荐阅读