Python如何删除子字符串中的所有字符(包括关键字)

2024-06-26 02:21:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个相当大的语料库(500k篇新文章)在一个数据框架中的一列中。大多数(并非所有)文章的开头都有各种各样的随意丢弃的文本,直到短语“(路透社)-”

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

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

从regex和pandas方法的角度来看,如何最好地解决这个问题,有什么想法吗?多谢各位

下面提供了一个例子,展示了文本在开始时(通常包括和(路透社))要移除的一般模式,以保持中间的去掉并在最后得到(所有的后续和包括)(由…编辑).除了这些关键词外,文章的确切语言、字符和长度各不相同

路透1月1日电(记者Chris Scicluna VALLETTA)---周二午夜钟声敲响,地中海岛国马耳他成为欧元区最小的成员国……[各行各业的文章文本]……公众宣传运动取得了公认的成功。(迈克尔·温弗瑞编辑)((加文。jones@reuters.com;+39-06-8522-4232;路透社消息:gavin.jones.Reuters。com@reuters.net))关键词:欧洲央行扩张/欧元区


Tags: 数据文本com框架编辑文章关键词regex
2条回答

如果你需要遵守诺言,你可以使用

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+空格括起来

regex demo #1regex demo #2

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

就在上面.split()

parts = starting_string.split("Reuters", 1)  # split at most once
story = parts[-1]  # get the last part

范例

>>> s = "blah blah Reuters bulk of the story"
>>> s.split("Reuters", 1)
['blah blah ', ' bulk of the story']
>>> "missing the newsgroup!".split("Reuters", 1)
['missing the newsgroup!']
>>> ["start", "end"][-1]
'end'
>>> ["bulk without splitword"][-1]
'bulk without splitword'

在分割目标周围添加空格或其他字符也会有所帮助

总而言之:

>>> s = "blah blah Reuters bulk of the story"
>>> s.split(" Reuters ", 1)[-1]
'bulk of the story'

您可能需要对可能出现的情况做一些额外的验证,即您的拆分字符串并没有在标题中没有的文章中简单地提到。也许很简单,如果有两个部分,第二部分比第一部分长,最多N个字符

相关问题 更多 >