正则表达式匹配重复的字符集

时间:2016-09-30 15:41:43

标签: python regex pandas

我希望能够从自由文本中提取以下模式。

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}。

什么是正确的正则表达式?

3 个答案:

答案 0 :(得分:0)

为什么不:

V[BSM]AV/[\d.]+

请参阅a demo on regex101.com

答案 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)

enter image description here

选项2
还不错

s.str.extract(r'(?P<first>\w+)/(?P<second>.*)', expand=True)

enter image description here

选项3
非常明确

cols = ['first', 'second']
s.str.extract(r'(?P<first>V[BSM]AV)/(?P<second>\d{6}(.\d{2})+)', expand=True)[cols]

enter image description here