通过正则表达式从字符串中提取多个值

Extract multiple values from a string via regex

我有许多来自第三方数据源的字符串,这些字符串的长度各不相同,同时包含下划线和 space。字符串的每一部分都很重要,我正试图通过 python 将它分成不同的字段。该字符串没有特殊字符(\n\t等)——应该只是space,下划线和括号用于分隔数据部分。

String Year State ID Sub ID Extra1 Extra2
2022_UT_T1000_100 (Classification1 Classification2) 2022 UT T1000 100 Classification1 Classification2
2021_TX_V999_005 (Classification1) 2021 TX V999 005 Classification1
1999_GA_123456_7890 1999 GA 123456 7890

我可以用下划线分割字符串,然后用 space 分割最后一个字段,但这似乎容易出错。 Regex 可能是最好的方法。

我可以用这个来匹配年份:^[1-9]\d{3,}$。但是,当尝试添加 OR 运算符时,它只会找到下划线。

当我知道存在模式时,有没有办法提取这些数据?

您可以尝试使用 str.extract 和正则表达式模式:

^(\d{4})_([^_]+)_([^_]+)_([^_ ]+)(?: \((\S+)(?: (\S+))?\))?$

请注意,此模式假定字符串列中只有三种变体,即没有额外的、有一个额外的或最多有两个额外的。对于括号中任意数量的单词,我们需要不同的方法。

Python 脚本:

df[["Year", "State", "ID", "Sub ID", "Extra1", "Extra2"]] = df["String"].str.extract(r'^(\d{4})_([^_]+)_([^_]+)_([^_ ]+)(?: \((\S+)(?: (\S+))?\))?$')

这是一个正则表达式 demo,表明该模式适用于字符串列的所有变体。