通过正则表达式从字符串中提取多个值
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,表明该模式适用于字符串列的所有变体。
我有许多来自第三方数据源的字符串,这些字符串的长度各不相同,同时包含下划线和 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,表明该模式适用于字符串列的所有变体。