我希望能够从自由文本中提取以下模式。
VBAV/123456.01
VBAV/132453.02
VSAV/132452.01.03
VMAV/142143.01.02
目前我正在尝试如下但没有太大成功
df["Project Id"] = df["WBS element"].str.cat(
df["Network VxAV"]).str.cat(
df["Text"]).str.cat(
df["Assignment"]).str.cat(
df["Reference"]).str.extract(
"(V[BSM]AV\/[\d]{6}[.0-30-3]{0,2})", expand=True)
对我来说,最具挑战性的部分是在最后提取重复的.01或.02或.03的模式。这部分可以重复0到2次,因此我尝试使用正则表达式{0,2}。
什么是正确的正则表达式?
答案 0 :(得分:0)
答案 1 :(得分:0)
r'V[BSM]AV/\d{6}(?:\.\d\d){0,2}(?!\d)'
完全匹配6位数,以及.##
的0-2个实例。 (?:xxxx)
是一个非捕获组。不能跟随另一个数字,所以它不匹配:
VBAV\1234567
VBAV\122346.123
您可能需要调整不能跟随匹配的内容。
答案 2 :(得分:0)
考虑pd.Series
s
s = pd.concat([pd.Series(txt.split('\n')) for _ in range(3)], ignore_index=True)
选项1
我的偏好
s.str.split('/', expand=True)
选项2
还不错
s.str.extract(r'(?P<first>\w+)/(?P<second>.*)', expand=True)
选项3
非常明确
cols = ['first', 'second']
s.str.extract(r'(?P<first>V[BSM]AV)/(?P<second>\d{6}(.\d{2})+)', expand=True)[cols]