【问题标题】:Filter strings that don't follow regex pattern in python在python中过滤不遵循正则表达式模式的字符串
【发布时间】:2020-08-20 20:53:58
【问题描述】:

我想从不遵循特定模式的 pandas 数据框中过滤字符串。但我只得到一个空的数据框

我的代码

l = ['Dubai', 'St. Petersburg', 'Aachen', '21323', '123134', 'Klaus@facebook.com']
l = pd.DataFrame(l)

pattern = re.compile("([A-Z])\w+|(\w[A-Z\u00E4-\u02AF])\w+", re.UNICODE)
df = l.filter(regex=pattern)

print(df)

输出:

Empty DataFrame
Columns: []
Index: [0, 1, 2, 3, 4, 5]

预期输出:

                0
0           Dubai
1  St. Petersburg
2          Aachen
3            None
4            None
5            None

【问题讨论】:

  • 不确定 Pandas,但“St. Petersburg”与您的 RegEx 不匹配。您需要允许“\”。和 "\s"/" " 用于包含在内。
  • 非常感谢您的帮助。很抱歉问,但我对正则表达式并没有那么复杂,并试图用你的建议进行测试,但不能让你帮我在哪里插入这些行?
  • 我建议使用 regex101.com 来满足您的所有正则表达式需求。 (只要确保使用 Python Flavor)regex101.com/r/8c0Ij3/1 老实说 - 我不确定你的 RegEx 是“应该”找到的。你想让它做什么?
  • df.filter 不会按照您的预期进行,它会过滤索引的数据框基本标签。来自文档:请注意,此例程不会根据其内容过滤数据框。过滤器应用于索引的标签。
  • @Changer 这个怎么样? regex101.com/r/N4dNaH/3 您可能需要在第一组 [A-Z] 中添加更多字符,因为它不包含任何非 ASCII 字符,例如 Ö 或 Ø

标签: python regex pandas


【解决方案1】:

df.filter() 方法根据行/列的名称进行过滤,而不是它们的内容;如文档中所述:“请注意,此例程不会根据其内容过滤数据框。过滤器应用于索引的标签。”

要做你想做的事,你可以定义一个这样的函数来进行模式匹配:

import numpy as np
import re

def like(x, pattern):
    r = re.compile(pattern)
    vlike = np.vectorize(lambda val: bool(r.fullmatch(val)))
    return vlike(x)

然后传递给.loc[]:

df = df.loc[like(df['column_name'], pattern), :]

现在,df 应该只包含列“column_name”与给定模式匹配的行。

您可以在this article 中查看示例。

【讨论】:

  • 感谢您的反馈,但由于我希望不匹配的值返回 None 我使用布尔索引,这似乎是一种更有效的解决方案pattern = re.compile("^([a-zA-Z\u0080-\u024F]+(?:(\. )|-| |'))*[a-zA-Z\u0080-\u024F]*$", re.IGNORECASE) l[l.str.match(pattern)==False]= None
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-02
  • 2020-08-05
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多