【问题标题】:Exact match of string in pandas pythonpandas python中字符串的精确匹配
【发布时间】:2017-10-30 11:46:09
【问题描述】:

我在数据框中有一列 ex df:

  A
0 Good to 1. Good communication EI : tathagata.kar@ae.com
1 SAP ECC Project System  EI: ram.vaddadi@ae.com
2 EI : ravikumar.swarna  Role:SSE  Minimum Skill  

我有一个字符串列表

ls=['tathagata.kar@ae.com','a.kar@ae.com']

现在如果我想过滤掉

for i in range(len(ls)):
   df1=df[df['A'].str.contains(ls[i])
        if len(df1.columns!=0):
            print ls[i]

我得到了输出

tathagata.kar@ae.com 
a.kar@ae.com

但我只需要tathagata.kar@ae.com

如何实现? 如您所见,我已经尝试过 str.contains 但我需要一些东西来完全匹配

【问题讨论】:

  • 在电子邮件地址前面添加一个空格(所以在ls 中)?因为 Python 是对的,a.kar@ae.com 在你的 df 的第一项中
  • 是的,我同意。我尝试做不同的事情,例如 str.contains(r'(?:\s|^)%s(?:\s|$)'%ls[i]) Where (Only the word在 ^(表示空格)和 $(表示字符串结尾)之间需要打印。但我的结果是空数据框。
  • 使用正则表达式 r'\s\w+'+ls[i],这个正则表达式匹配一个空格,然后是字符,然后是你的字符串。如果这有助于将其更新为答案
  • @IsaacDj 我尝试使用 str.contains(r'\s\w+'+ls[i]) 但我得到了 a.kar@ ae.com 作为我的输出,而不是相反。
  • 尝试解析 ls[i],在正则表达式的情况下,它需要将句点反斜杠:r'\s\w+'+ls[i].replace('.',r'\ .')

标签: regex excel python-2.7 pandas


【解决方案1】:

你可以简单地使用 ==

string_a == string_b

如果两个字符串相等,它应该返回 True。但这并不能解决您的问题。

编辑 2: 您应该使用 len(df1.index) 而不是 len(df1.columns)。事实上, len(df1.columns) 会给你列数,而不是行数。

编辑 3: 阅读您的第二篇文章后,我明白了您的问题。您提出的解决方案可能会导致一些错误。 例如,如果您有:

ls=['tathagata.kar@ae.com','a.kar@ae.com', 'tathagata.kar@ae.co']

第一个和第三个元素将匹配 str.contains(r'(?:\s|^|Ei:|EI:|EI-)'+ls[i]) 这是不受欢迎的行为。

您可以在字符串末尾添加一个检查:str.contains(r'(?:\s|^|Ei:|EI:|EI-)'+ls[i]+r'(?: \s|$)')

像这样:

for i in range(len(ls)):
  df1 = df[df['A'].str.contains(r'(?:\s|^|Ei:|EI:|EI-)'+ls[i]+r'(?:\s|$)')]
  if len(df1.index != 0):
      print (ls[i])

(如果你使用python 2.7,请删除“打印”中的括号)

【讨论】:

  • 感谢您的回答,但我没听懂。你能在我的例子中展示它吗?
【解决方案2】:

感谢您的帮助。但似乎我找到了一个目前有效的解决方案。

必须使用str.contains(r'(?:\s|^|Ei:|EI:|EI-)'+ls[i]) 这似乎解决了问题。

虽然感谢@IsaacDj 的帮助。

【讨论】:

  • 当您使用 str.match 而不是那个复杂的正则表达式时发生了什么?
  • 它没有返回任何值,都试过了。我正在寻找一个更简单的解决方案。你能帮我一个吗?
  • 如果在所有要查找的字符串之前都有一个空格字符,就像在您的示例数据中一样,也许您可​​以简化一下您的正则表达式: str.contains(' '+ls[i]+r'( ?:\s|$)')
【解决方案3】:

为什么不直接使用:

df1 = df[df['A'].[str.match][1](ls[i])

相当于正则匹配。

【讨论】:

    猜你喜欢
    • 2020-10-01
    • 2016-03-08
    • 2021-10-18
    • 1970-01-01
    相关资源
    最近更新 更多