【问题标题】:Applying re.search function to column in Python将 re.search 函数应用于 Python 中的列
【发布时间】:2018-06-04 00:49:36
【问题描述】:

我有以下 Python 代码(我想要文本字段中特定数字的第一个匹配项):

import numpy as np
import pandas

data = {'A': [1, 2, 3], 'B': ['bla 4044 bla', 'bla 5022 bla', 'bla 6045 bla']}
df = pandas.DataFrame(data)

def fun_subjectnr(column):
    column = str(column)
    subjectnr = re.search(r"(\b[4][0-1][0-9][0-9]\b)",column)
    subjectnr1 = re.search(r"(\b[2-3|6-8][0-9][0-9][0-5]\b)",column)
    subjectnr = np.where(subjectnr == "" and subjectnr1 != "", subjectnr1, 
    subjectnr)
    return subjectnr1

df['C'] = df['B'].apply(fun_subjectnr)

想要的输出:

 A    B                C
 1    bla 4044 bla    4044
 2    bla 5022 bla    None
 3    bla 6045 bla    6045

它似乎不起作用。当我将 [0] 添加到正则表达式代码时,它会给出错误...(subjectnr = re.search(r"(\b[4][0-1][0-9][0-9]\ b)",column)[0])

谁知道该怎么做?提前致谢!

【问题讨论】:

  • 你能解释一下你是如何得到这个输出的吗?你应该使用Series.str.findall
  • 我已经尝试过 findall 并且它有效,但我不想要所有匹配项,只有第一个匹配项......
  • 好的,然后Series.str.extract。我的问题是,你到底想做什么?为什么第二个结果是 None?
  • 我想要第一个匹配项(特定格式的数字),所以第二个不是正确的格式数字(bc 第一个数字是 5)。我会尝试做 series.str.extract,谢谢!
  • 如果答案有什么不足,请告诉我。如果没有,请考虑将其标记为接受。非常感谢。

标签: python regex pandas


【解决方案1】:

您可以使用str.extract 执行此操作。你也可以稍微压缩一下你的模式,如下所示。

p = r'\b(4[0-1]\d{2}|(?:[2-3]|[6-8])\d{2}[0-5])\b'
df['C'] = df.B.str.extract(p, expand=False)

df

   A             B     C
0  1  bla 4044 bla  4044
1  2  bla 5022 bla   NaN
2  3  bla 6045 bla  6045

这应该比调用apply 快得多。


详情

\b                 # word boundary
(                  # first capture group
   4               # match digit 4
   [0-1]           # match 0 or 1
   \d{2}           # match any two digits
|
   (?:             # non-capture group (prevent ambiguity during matching)
       [2-3]       # 2 or 3
       |           # regex OR metacharacter
       [6-8]       # 6, 7, or 8
   )
   \d{2}           # any two digits
   [0-5]           # any digit b/w 0 and 5
)
\b

【讨论】:

  • 感谢您的回答和正则表达式建议,它有效(并且我减少了代码量:))!
猜你喜欢
  • 1970-01-01
  • 2018-11-25
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 2013-11-28
相关资源
最近更新 更多