Python 将正则表达式应用于df在新列中添加值

Python 将正则表达式应用于df在新列中添加值,python,regex,Python,Regex,这是我的数据集: BlaBla 128 MB EE ADTD 6 gb DTS EEEDC 2GB RS STA 12MB DFA BBNB 32 mb YED 我想从这个数据集中提取MB/GB的数量和单位MB/GB。因此,我创建了以下正则表达式: (\d*)\s?(MB|GB) 我创建的用于将正则表达式应用于我的df的代码是: pattern = re.compile(r'(\d*)\s?(MB|GB)') invoice_df['mbs'] = invoice_df['Rate Plan

这是我的数据集:

BlaBla 128 MB EE
ADTD 6 gb DTS
EEEDC 2GB RS
STA 12MB DFA
BBNB 32 mb YED
我想从这个数据集中提取MB/GB的数量和单位MB/GB。因此,我创建了以下正则表达式:

(\d*)\s?(MB|GB)
我创建的用于将正则表达式应用于我的df的代码是:

pattern = re.compile(r'(\d*)\s?(MB|GB)')
invoice_df['mbs'] = invoice_df['Rate Plan'].apply(lambda x: pattern.search(x).group(1))
invoice_df['unit'] = invoice_df['Rate Plan'].apply(lambda x: pattern.search(x).group(2))
但是,当将正则表达式应用于我的df时,它会给出以下错误消息:

AttributeError: 'NoneType' object has no attribute 'group'

我能做些什么来解决这个问题?

您只需在请求组之前检查是否找到了某些内容:

import re

inputs = ["BlaBla 128 MB EE",
"ADTD 6 gb DTS",
"EEEDC 2GB RS",
"STA 12MB DFA",
"BBNB 32 mb YED",
"Nothing to find here"]

pattern = re.compile("(\d+)\s*([MG]B)", re.IGNORECASE)

for input in inputs:
    match = re.search(pattern, input)
    if match:
        mbs = match.group(1)
        unit = match.group(2)
        print (mbs, unit.upper())
    else:
        print "Nothing found for : %r" % input

# ('128', 'MB')
# ('6', 'GB')
# ('2', 'GB')
# ('12', 'MB')
# ('32', 'MB')
# Nothing found for : 'Nothing to find here'
使用您的代码:

pattern = re.compile("(\d+)\s*([MG]B)", re.IGNORECASE)
match = re.search(pattern, invoice_df['Rate Plan'])
if match:
    invoice_df['mbs'] = match.group(1)
    invoice_df['unit'] = match.group(2)

它比lambda IMHO更具可读性,并且不会执行两次搜索。

由于某些条目可能不匹配,因此
重新搜索失败(返回不匹配)。您需要考虑lambda中的这些情况:

apply(lambda x: pattern.search(x).group(1) if pattern.search(x) else "")
我也建议使用

(?i)(\d+)\s*([MGK]B)

它将找到1+个数字(
\d+
,第1组),后跟0+个空格(
\s*
),并以不区分大小写的方式将
KB
GB
MB
匹配到第2组(
([MGK]B)
)中。

如果将该模式设置为不区分大小写呢<代码>(?i)(\d+)\s*(MB | GB)
?我还将
+
\d
*
\s
@WiktorStribiż一起使用
+
查看仍然相同的错误消息,因此,有些条目只是不包含匹配项,您访问
组(1)
组(2)
,而不检查是否出现匹配项。是的,这也是我所期望的。我知道存在不匹配的条目…我希望将其保留为空。请尝试
apply(lambda x:pattern.search(x).group(1)if pattern.search(x)else“”)