熊猫删除某些字符前后的文本

时间:2018-08-21 15:05:29

标签: python python-3.x pandas

我不确定我的头衔很好,所以如果有人有建议,我会支持。

假设我有以下情况:

搜索“哪里”

输入:

<Dave likes cake.> <Dave goes to school.> <Where is dave today, after school?/><I do not know where dave is>
<Cindy reads a book><Where is my shoe asked cindy.><Cindy likes bacon.><Cindy goes to the park.><where did cindy go?>
<Sally drinks wine.><The lake is where I am from commented Sally><Cindy watches day time television while watching the kids.><Cindy makes great sandwiches><where is the sandwich cindy made?>

所需的输出:

<Where is dave today, after school?/><I do not know where dave is>
<Where is my shoe asked cindy.><where did cindy go?>
<The lake is where I am from commented Sally><where is the sandwich cindy made?>

我想让一切都从包含我要搜索的短语的另一组字符中的第一个字符开始。

我还希望删除包含我要查找的短语的第一个字符之前的所有内容,以及删除包含该短语的最后一个字符之后的所有内容。

有什么建议吗?我不确定如何解决这个问题,但是我正在考虑使用某种正则表达式,并带有向前/向后的外观?

编辑#1:上下文已添加到我正在做的事情

这与大熊猫有关,因为我已将XML文件存储为大熊猫数据框内的文本。 XML文件是一个SSIS包,我需要搜索该单词和短语。

我进行了联接,以将所有xml连接到1行中。

编辑#2:更多上下文

我在查看的XML数据中存在多行SQL语句时遇到问题,这就是我将' '.join都使用1行的原因。

我不仅需要查找XML中的位置,而且还可以返回所有SQL语句(如果我要查找的内容是多行SQL语句的一部分)。

编辑#3:

此解决方案(由下面的另一个用户提供)解决了该问题,但仅返回第一个实例。如果有人有返回所有实例的解决方案,我将把答案标记为已解决。

有效但仅返回第一个实例的解决方案:

df.text.str.extract(r'(?i)(<[^<]*?where[^>]*?>)')

                                               0
0          <Where is dave today, after school?/>
1                <Where is my shoe asked cindy.>
2  <The lake is where I am from commented Sally>

编辑#4:返回所有匹配项

提供我的解决方案的用户使用findall而不是extract来返回所有行。

现在已经100%解决了。

2 个答案:

答案 0 :(得分:3)

使用class Website extends Model { use \Staudenmeir\EloquentHasManyDeep\HasRelationships; public function posts() { return $this->hasManyDeep( Post::class, ['website_providers', Provider::class, 'provider_posts'] )->withPivot('provider_posts', ['post_name']); } }

str.extract

正则表达式说明:

df.text.str.extract(r'(?i)(<[^<]*?where[^>]*?>)')

                                               0
0          <Where is dave today, after school?/>
1                <Where is my shoe asked cindy.>
2  <The lake is where I am from commented Sally>

答案 1 :(得分:2)

可能的解决方法如下:

import re

a ='<Dave likes cake.> <Dave goes to school.> <Where is dave today, after school?/>'
b ='<Cindy reads a book><Where is my shoe asked cindy.><Cindy likes bacon.><Cindy goes to the park.>'
def find_where(str):
    mylist =str.split('<')
    r = re.compile(".*[W,w]here")
    newlist = list(filter(r.match, mylist)) # Read Note
    finallist = ['<'+x for x in newlist]
    return finallist[0]

如果您随后将该函数应用于您的一个字符串:

new_a = find_where(a)

并打印结果,您将获得输出:

'<Where is dave today, after school?/>'

假设您发布的字符串是数据框的一列元素(如标题所示),您可以照此进行操作,以应用于数据框:

df.mycolumn = df.mycolumn.apply(find_where)