为特定元素解析字符串 - python

parsing strings for specific elements - python

我有一个 pandas 数据框,其中包含一列具有以下模式的句子: 列的第 1 行:“ID 为 123 或 ID 为 234 或 ID 为 345” 列的第 2 行:“ID 为 123 或 ID 为 567 或 ID 为 876” 列的第 3 行:“ID 是 567 或 ID 是 567 或 ID 是 298”。

我的目标是提取每行中的数字并将它们保存在列表或 numpy 数组中。因为有一个模式(数字总是在“ID is”之后,我认为正则表达式可能是最好的方法(但我不确定如何使用正则表达式在 1 个字符串中进行多次提取。

有什么建议吗?

标准模块re可以使用'\d+'

re.findall('\d+', "ID is 123 or ID is 234 or ID is 345")

获取列表[123,234,345]

为了确保您也可以使用 'ID is (\d+)'

re.findall('ID is (\d+)', "ID is 123 or ID is 234 or ID is 345")

DataFrame 中,您可以使用 .str.findall() 对所有行执行相同的操作。

import pandas as pd


df = pd.DataFrame({
  'ID': [
    "ID is 123 or ID is 234 or ID is 345",
    "ID is 123 or ID is 567 or ID is 876",
    "ID is 567 or ID is 567 or ID is 298",
  ]
})

print('\n--- before ---\n')
print(df)
 
df['result'] = df['ID'].str.findall('ID is (\d+)')

print('\n--- after ---\n')
print(df)

结果:

--- before ---

                                    ID
0  ID is 123 or ID is 234 or ID is 345
1  ID is 123 or ID is 567 or ID is 876
2  ID is 567 or ID is 567 or ID is 298

--- after ---

                                    ID           result
0  ID is 123 or ID is 234 or ID is 345  [123, 234, 345]
1  ID is 123 or ID is 567 or ID is 876  [123, 567, 876]
2  ID is 567 or ID is 567 or ID is 298  [567, 567, 298]

如果您只需要 result 列作为 numpy array 那么您可以获得 df['result'].values.

如果您需要嵌套列表:df['result'].values.tolist().