我正在尝试从 pandas 中非常困惑的字符串字段中提取型号。复杂的是,这些序列号不仅是数字,有时也是字母数字。我想要完成的是创建一个正则表达式捕获组/组合,它允许我仅在字母字符连续位于数字序列之前、结尾或内部时捕获字母字符:
model_number
part b: 101-03-0458B
B.2017Z brand name
brand - 027xY21
至
model_number_stripped
101030458B
B2017Z
027xY21
到目前为止,我有以下内容:
df['model_number_stripped'] = df['model_number'].str.replace('-','').str.replace('.','').str.replace('\D+','')
最佳答案
您可以使用
df['model_number_stripped'] = df['model_number'].str.replace(r'\W+|(?<!\d)[^\W\d_](?![^\s\d]*\d)', '')
查看此regex demo
详细信息
-
\W+
- 1 个或多个除字母、数字和_
之外的字符(如果您想删除_
,请使用[\W_]+
) -
|
- 或 -
(?<!\d)[^\W\d_](?![^\s\d]*\d)
- 前面没有数字 ([^\W\d_]
) 且后面没有除空格和数字 ((?<!\d)
) 之外的任何 0+ 字符且后跟数字 ([^\s\d]*
) 的任何字母 (\d
)。请注意(?<!\d)
是一个负向后查找,紧邻当前位置的左侧,需要缺少数字。(?![^\s\d]*\d)
模式是一个否定的前瞻,如果在当前位置的右侧立即找到其模式,则匹配失败。
关于Python 正则表达式 - 保持字母字符连续相邻/在数字序列内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51973529/