“从中提取数字”日AAA级日BBB或AAA日BBB公司日"

2024-10-02 08:15:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从任意文本中提取两个值,以可变的方式格式化。这两个值是不同的,我想根据附近的sring来区分它们,比如说“DDT”和“EEG”。下面是一些如何格式化字符串的示例。你知道吗

This contains 42.121% DDT and 2.1% EEG

Now with DDT: 12% EEG: 23.2%

47 DDT 22 EEG

EEG N/A DDT 43

5% EEG 20% DDT and more

本质上,我需要能够选择前面和后面都有标识符的值。你知道吗

我一直在使用两个选择器之间的|来捕获每个值的两个“案例”,但我遇到了问题。我想防止regex在第二个示例行中选择“12%EEG”。我试着用消极的眼神和积极的眼神,但不能让它起作用。你知道吗

这里是正则表达式选择只是滴滴涕

(?<=eeg)(\d{1,3}\.?\d{1,6}).{,10}?ddt|ddt(?!.*eeg).{,10}?(\d{1,3}\.?\d{1,6})

这是我得到的最接近的,但它仍然不能正常工作。此版本与“20%滴滴涕”不匹配

我原来的正则表达式没有使用lookbehinds,但在某些情况下也失败了。你知道吗

(?:(?:(\d{1,3}\.?\d*)[^(?:eeg)]{0,10}?ddt)|(?:ddt[^(?:eeg)]{0,10}?(\d{1,3}\.?\d*)))

我最初的方法无法识别像这样格式的23.2%的EEG字符串。”滴滴涕:12%脑电图:23.2%“

我不确定这种类型的选择器是否可以与regex一起使用,但是我想使用regex来矢量化这个提取。我有一个函数可以很好地描述这些字符串,但在大型数据集(约100万条记录)上速度非常慢。regex运行很快,很容易应用于向量,这就是为什么我要使用它。如果有其他建议来解决这个问题与NLP或numpy/pandas功能,我也愿意接受这些。你知道吗


Tags: and字符串文本示例方式选择器thisddt
1条回答
网友
1楼 · 发布于 2024-10-02 08:15:21

至少在这些情况下,您可以尝试以下操作:

1/找出谁是第一个脑电图或滴滴涕:

In [11]: s.str.extract("(DDT|EEG)")
Out[11]:
     0
0  DDT
1  DDT
2  DDT
3  EEG
4  EEG

2/拔出所有的号码:

In [12]: s.str.extract("(\d+\.?\d*|N/A).*?(\d+\.?\d*|N/A)")
Out[12]:
        0     1
0  42.121   2.1
1      12  23.2
2      47    22
3     N/A    43
4       5    20

要摆脱N/A,您可以向\u numeric申请:

In [13]: res = s.str.extract("(\d+\.?\d*|N/A).*?(\d+\.?\d*|N/A)").apply(pd.to_numeric, errors='coerce', axis=1)

In [14]: res
Out[14]:
        0     1
0  42.121   2.1
1  12.000  23.2
2  47.000  22.0
3     NaN  43.0
4   5.000  20.0

现在您必须重新排列这些列以匹配其各自的DDT/EEG:

In [15]: pd.DataFrame({
           "DDT": res[0].where(s.str.extract("(DDT|EEG)")[0] == 'DDT', res[1]),
           "EEG": res[1].where(s.str.extract("(DDT|EEG)")[0] == 'DDT', res[0])
         })
Out[15]:
      DDT   EEG
0  42.121   2.1
1  12.000  23.2
2  47.000  22.0
3  43.000   NaN
4  20.000   5.0

这里s是原始系列/列:

In [21]: s
Out[21]:
0    This contains 42.121% DDT and 2.1% EEG
1              Now with DDT: 12% EEG: 23.2%
2                             47 DDT 22 EEG
3                            EEG N/A DDT 43
4                   5% EEG 20% DDT and more
dtype: object

这假设DDT和EEG都存在,您可能需要找出不存在这种情况的行(只有DDT/EEG中的一个)。。。你知道吗

相关问题 更多 >

    热门问题