【问题标题】:Pandas string match negative lookahead not working熊猫字符串匹配负前瞻不起作用
【发布时间】:2020-06-11 16:11:14
【问题描述】:

我想将我的 Pandas 数据框中与所需格式不匹配的所有值设置为 NaN。

不受欢迎的格式示例:

代码

df['Anfang L1'] = df['Anfang L1'].str.replace(r'(?!\D{3}.\d{2})', '')

正则表达式在没有否定前瞻的情况下工作。 正则表达式也适用于 str.match 函数中的负前瞻。

df[df['Anfang L1'].str.match('(?!\D{3}.\d{2})')]

谢谢你们帮助我。

PS:我也尝试了以下

df['Anfang L1'].replace(to_replace=r'(?!\D{3}.\d{2})', value='new', inplace=True)

【问题讨论】:

  • 正确格式化您的代码
  • 你需要什么?你说你的正则表达式运行良好。但是,必须对点进行转义以匹配文字点。请发布可重现的代码 sn-p 来重现问题,以及预期的结果。
  • 以防万一,当您仍在研究可重现的示例时,请尝试df['Anfang L1'].replace([r'^\d{2}\.\d{4}$'], np.nan, regex=True, inplace=True)
  • @WiktorStribiżew 这有效,请将其发布为解决方案,以便我可以将此问题标记为已解决。感谢您的帮助。
  • 我在an answer below 上发布了一个解释

标签: python regex pandas regex-lookarounds regex-negation


【解决方案1】:

你可以使用

df['Anfang L1'].replace([r'^\d{2}\.\d{4}$'], np.nan, regex=True, inplace=True)

如果您需要匹配除^\D{3}\.\d{2}$ 之外的所有模式,请使用

df['Anfang L1'].replace([r'^(?!\D{3}\.\d{2}$).*'], np.nan, regex=True, inplace=True)

^\d{2}\.\d{4}$ 模式匹配

  • ^ - 字符串开头
  • \d{2} - 两位数
  • \. - 一个点
  • \d{4} - 四位数
  • $ - 字符串结束

另一种模式的意思是:

  • ^ - 字符串开头
  • (?!\D{3}\.\d{2}$) - 就在那里,直到最后,不应该有
    • \D{3} - 三个非数字字符
    • \. - 一个点
    • \d{2} - 两位数
  • .* - 字符串的所有其余部分。

【讨论】:

  • 非常感谢您,我也尝试了您的解决方案,并且成功了!我的问题是为什么我必须在最后做 .*
  • @FrederikLedermüller 使用.*,您使用与前瞻中的模式不匹配的字符串(前瞻是非消费模式,即它们匹配的文本不会添加到匹配缓冲区,因此不受替换操作的影响。
【解决方案2】:

问题在于正则表达式的定义。

Negative Lookahead A(?!B) 用于匹配所有Anot,后跟B

最终目标是将所有与\D{3}\.\d{2}不匹配的条目设置为NaN

一种方法,

# Get a `series` of values which is true if it matches my format
match_my_correct_format = df['Anfang L1'].str.contains(r'\D{3}\.\d{2}')

# Set all rows which don't match my format to null
df[~match_my_correct_format] = np.nan

【讨论】:

  • 但我只想将那一列设置为 np.nan
  • 把最后一行改成df['Anfang L1'][~match_my_correct_format] = np.nan
  • 我发现首先发布的解决方案只解决了一个格式错误的案例,但您的解决方案对所有人都有效。 Thx 伙计,我已经尝试解决这个问题两天了。您的最后评论是必要的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 2021-04-26
  • 1970-01-01
相关资源
最近更新 更多