【问题标题】:List to regex including leading blank包含前导空白的正则表达式列表
【发布时间】:2020-11-16 07:27:08
【问题描述】:

我的清单

mylist = [apple, banana, grape]
df

text
I love banana
apple is delicious
I eat pineapple
hate whitegrape

要匹配文本中包含列表的事物,请执行以下操作。

mylist = [f"(?i){re.escape(k.lower())}" for k in mylist]
extracted = df['text'].str.lower().str.findall(f'({"|".join(mylist)})').apply(set)
df['matching'] = extracted.str.join(',')

匹配有问题,但是由于列表前面没有空格,所以我要找的'apple'包含在'pineapple'中,所以匹配了。

再举一个例子,我正在寻找“葡萄”,但白葡萄中含有葡萄,所以这也算在内。

如何在列表中每个索引的开头留一个空格?

result above
text                 matching
I love banana        banana
apple is delicious   apple
I eat pineapple      apple
hate whitegrape      grape

得到我想要的结果

text                 matching
I love banana        banana
apple is delicious   apple
I eat pineapple  
hate whitegrape 

【问题讨论】:

  • Ieatpineapple ...Ilovebanana ,这种情况很难
  • 正则表达式中的单词边界(实际上是两个)可能会有所帮助:\b 但其中一些文本无法识别。
  • @YOBEN_S 如果文字之间有空格会不会一样?编辑内容
  • @MichaelButscher 即使在句子中的单词之间应用空格也很难移动吗?请看上面的修改内容。

标签: python python-3.x regex pandas


【解决方案1】:

那你可以split

df.text.str.lower().str.split().apply(lambda x : [y for y in x if y in mylist]).str[0]
Out[227]: 
0    banana
1     apple
2       NaN
3       NaN
Name: text, dtype: object

更新为str.findall

df.text.str.lower().str.findall(r'\b({0})\b'.format('|'.join(mylist)))
Out[248]: 
0    [banana]
1     [apple]
2          []
3          []
Name: text, dtype: object

【讨论】:

  • @ybin 然后执行字符串 findall
  • 添加 re.IGNORECASE 标志可能会更好,因为 OP 使用 str.lower。 @YOBEN_S
  • @MrNobody33 是的,我用过df['text'].str.lower().str.findall(r'\b({0})\b'.format('|'.join(mylist))).apply(set)
  • 当然@ybin,我知道,这只是避免使用str.lower 并使用re 提供给我们的标志的建议。 :)
【解决方案2】:

你可以使用:

 df.text.str.extract(f"(?i)\\b({'|'.join(mylist)})\\b")
        0
0  banana
1   apple
2     NaN
3     NaN

当然,您可以根据您的示例将extract 更改为findall

【讨论】:

    猜你喜欢
    • 2013-07-26
    • 2021-10-31
    • 2017-05-09
    • 2016-02-29
    • 2018-08-16
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多