【问题标题】:Python regex to pick all elements that don't match patternPython 正则表达式选择所有不匹配模式的元素
【发布时间】:2021-03-06 22:25:53
【问题描述】:

我昨天问了一个类似的问题Keep elements with pattern in pandas series without converting them to list,现在我面临着相反的问题。

我有一个熊猫数据框:

import pandas as pd
df = pd.DataFrame(["Air type:1, Space kind:2, water, wood", "berries, something at the start:4, Space blu:3, somethingelse"], columns = ['A'])

我想挑选所有没有“:”的元素。 我尝试的是以下似乎正在工作的正则表达式:

df['new'] = df.A.str.findall('(^|\s)([^:,]+)(,|$)')
    A                                                               new
0   Air type:1, Space kind:2, water, wood                           [( , water, ,), ( , wood, )]
1   berries, something at the start:4, Space blu:3, somethingelse   [(, berries, ,), ( , somethingelse, )]

如果我理解正确,findall 搜索了 3 种模式(括号中的模式)并返回了在列表中包含的元组中可以找到的尽可能多的模式。 有没有办法避免这种情况,只返回中间模式? 如第一排:水,木头 第二行:浆果,其他的东西

我也尝试了相反的方法:

df.A.str.replace('[^\s,][^:,]+:[^:,]+', '').str.replace('\s*,', '')

这似乎与我想要的很接近(仅缺少模式之间的逗号),但我想知道我是否遗漏了一些能让我的生活更轻松的东西。

【问题讨论】:

  • 试试这个:df.A.str.findall(r'(?:^|,)([^:,]+)(?=,|$)')

标签: python regex pandas


【解决方案1】:

您可以使用以下使用非捕获组(?:) 的正则表达式:

df.A.str.findall(r'(?:^|\s)([^:,]{2,})(?:,|$)')

这将返回以下输出:

Name: A, dtype: object
0               [water, wood]
1    [berries, somethingelse]

【讨论】:

  • 这很好,唯一的问题是在我的实际数据中,我并不总是出现两次 : 模式。不过谢谢!
  • [^:,]{2,} 表示您将只匹配至少有 2 个连续字符不是 :, 的字符串。这将确保您不会将字符串与单个字母匹配。
  • 他们还不错,只是一个复杂的话题;-)。不客气,祝你有美好的一天
【解决方案2】:

您可以使用此正则表达式代码:

>>> df['new'] = df.A.str.findall(r'(?:^|,)([^:,]+)(?=,|$)')
>>> print (df)
                                                   A                        new
0              Air type:1, Space kind:2, water, wood            [ water,  wood]
1  berries, something at the start:4, Space blu:3...  [berries,  somethingelse]

使用的正则表达式是:

(?:^|,):匹配开始或逗号

  • ([^:,]+):匹配任何不是: 且不是, 的字符的1+
  • (?=,|$):提前断言我们有 , 或前面的行尾

【讨论】:

  • 也可以使用df.A.str.findall(r'(?:^|,)([^:,]+)(?=,|$)').apply(','.join) 来获取以逗号分隔的匹配子字符串列表
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2015-03-08
  • 2015-11-25
  • 1970-01-01
相关资源
最近更新 更多