【问题标题】:Pandas regex - conditional matchingPandas 正则表达式 - 条件匹配
【发布时间】:2020-10-13 15:12:26
【问题描述】:

我有一个这样的数据框:

pd.DataFrame({'course_code': ['BUS225 - DC - 02-21-17', 
                          'N320L - EM8 - 01-21-20 - Sect1', 'N495 - LA8 - 05-14-19 - Sect3']})

我正在尝试编写一个正则表达式(使用 pandas),它会返回以下输出:

pd.DataFrame({'course_code': ['BUS225', 'N320L', 'N495']})

目前这是我的代码:

df.course_code.str.extract(r'(\A\D\D\D\d\d\d)')

我知道我在这里遗漏了一些东西。我很难捕捉“L”,以及处理在字符串开头有 3 个字母与 1 个字母的课程代码。

【问题讨论】:

  • 使用df.course_code.str.split(r' - ').str[0]
  • 或者,df.course_code.str.extract(r'^([A-Z]+\d+[A-Z]*)')
  • 谢谢维克托!
  • 提醒一下,建议的答案使用 pandas 的字符串方法,因为这里不需要正则表达式,这是一个非常简单的 pandas 操作问题。我很感激解释为什么我的答案是错误的,因为我很难看到自己。让我们用常识正确地使用投票功能。
  • 我所做的每一个带有正则表达式标记的答案都被否决了,真是巧合。 SO中正确行为的一个糟糕的例子

标签: python python-3.x regex pandas


【解决方案1】:

在第一次出现分隔符' - ' 时拆分并保留第一个元素就足够了:

df['course_code'] = df.course_code.str.split(' - ', n=1, expand=True)[0]

print(df)
  course_code
0      BUS225
1       N320L
2        N495

【讨论】:

  • 你能帮我用正则表达式解决这个问题吗?我正在努力学习这一点,需要帮助。你的答案是正确的,我会相信你。
  • 你能指定结构吗?这些子字符串与 (\A\D\D\D\d\d\d) @MichaelMathewsJr 不匹配。
  • 是的,你可以忘记我的代码它不起作用。我想要那个确切的输出,但使用正则表达式。
  • 问题是我需要知道如何匹配那个子字符串,所以你必须解释使用什么逻辑@MichaelMathewsJr。
  • 现在看来df.course_code.str.extract(r'^(\w+) ')[0] 应该足够了@MichaelMathewsJr。
【解决方案2】:

您可以在系列上使用带有拆分功能的 lambda 表达式。在您的问题中,用“ - ”分割可以正常工作,您不需要为它找到正则表达式:

df = df.assign(course_code = lambda x: x['course_code'].apply(lambda s: s.split(' - ')[0]))

如果你想要一个正则表达式,你应该解释你想要的字符串第一部分的结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多