这是我的数据集:
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'
我能做些什么来解决这个问题?
由于某些条目可能不匹配,因此re.search
会失败(返回任何匹配项)。您需要考虑 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)
)。
您只需要在请求组之前检查是否已找到某些内容:
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 更具可读性,并且不会执行两次搜索。