Pandas字符串匹配否定超前无效

问题描述 投票:1回答:2

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

不期望的格式的示例:

“格式不正确的示例”

代码

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

正则表达式在没有负前瞻的情况下正常工作。regex表达式也可以与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)
python regex pandas regex-lookarounds regex-negation
2个回答
0
投票

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

A 负前瞻 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

0
投票

您可以使用

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}-两位数字
  • [.*-字符串的其余部分。
© www.soinside.com 2019 - 2024. All rights reserved.