pandas extractall() 没有提取给定正则表达式的所有案例?

Posted

技术标签:

【中文标题】pandas extractall() 没有提取给定正则表达式的所有案例?【英文标题】:pandas extractall() is not extracting all cases given a regex? 【发布时间】:2017-07-04 09:49:26 【问题描述】:

我有一个嵌套的字符串列表,我想从中提取日期。日期格式为:

两个数字(从0112)连字符树字母(有效月份) 用连字符连接两个数字,例如:08-Jan—0703-Oct—01

我尝试使用以下正则表达式:

r'\d2(—|-)(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-\d2,4'

然后我测试如下:

import pandas as pd
df = pd.DataFrame('blobs':['6-Feb- 1 4 Facebook’s virtual-reality division created a 3-EBÚ7 11 network of 500 free demo stations in Best Buy stores to give people a taste of VR using the Oculus Rift 90 GT 48 headset. But according to a Wednesday report from Business Insider, about 200 of the demo stations will close after low interest from consumers. 17-Feb-2014',
                         'I think in a store environment getting people to sit down and go through that experience of getting a headset on and getting set up is quite a difficult thing to achieve,” said Geoff Blaber, a CCS Insight analyst. 29—Oct-2012 Blaber 32 FAX 2978 expects that it will get easier when companies can convince  18-Oct-12 credit cards. '
                            ])
df

然后:

df['blobs'].str.extractall(r'\d2(—|-)(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-\d2,4')

然而,他们没有工作。以前的正则表达式没有给我任何东西(即只是炒作-):

    Col
0   NaN
1    -
2    -
3   NaN
4   NaN
5    -
...
n    -

我怎样才能修复它们才能获得?:

           Col
0 6-Feb-14, 17-Feb-2014
1 29—Oct-2012, 18-Oct-12

更新

我也尝试过:

import re
df['col'] = df.blobs.apply(lambda x: re.findall('\d2(—|-)(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-\d2,4',x))
s = df.apply(lambda x: pd.Series(x['col']),axis=1).stack().reset_index(level=1, drop=True)
s.name = "col"
df = df.drop('col')
df

不过我也得到了:

ValueError                                Traceback (most recent call last)
<ipython-input-4-5e9a34bd159f> in <module>()
      3 s = df.apply(lambda x: pd.Series(x['col']),axis=1).stack().reset_index(level=1, drop=True)
      4 s.name = "col"
----> 5 df = df.drop('col')
      6 df

/usr/local/lib/python3.5/site-packages/pandas/core/generic.py in drop(self, labels, axis, level, inplace, errors)
   1905                 new_axis = axis.drop(labels, level=level, errors=errors)
   1906             else:
-> 1907                 new_axis = axis.drop(labels, errors=errors)
   1908             dropped = self.reindex(**axis_name: new_axis)
   1909             try:

/usr/local/lib/python3.5/site-packages/pandas/indexes/base.py in drop(self, labels, errors)
   3260             if errors != 'ignore':
   3261                 raise ValueError('labels %s not contained in axis' %
-> 3262                                  labels[mask])
   3263             indexer = indexer[~mask]
   3264         return self.delete(indexer)

ValueError: labels ['col'] not contained in axis

【问题讨论】:

(:?) 是一个错字,对吧?试试r"\b\d2-(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-\d2\b"。如果可以有 en- 或 em-dashes,请将 - 替换为 [-–—] 一目了然,您的正则表达式与连字符不匹配。 如果您希望6-Feb 被接受,那么您需要预先允许 一个 数字而不是两个。例如\d1,2 SO 将垃圾字符插入 cmets,请勿从此处复制。见regex101.com/r/IRqoon/1 @johndoe:将extract 替换为extractall 【参考方案1】:

当您使用Series.str.extractSeries.str.extractall 时,将返回捕获的 子字符串,而不是整个匹配项。因此,您需要确保捕获(即添加())您需要抓取的模式部分。

现在,您的行中的几个预期匹配项使处理 extractall 变得更加困难,您似乎可以使用 Series.str.findall,如果在模式。

使用

rx = r'\b\d1,2[-–—](?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[-–—](?:\d4|\d2)\b'
df['Col'] = df['blobs'].str.findall(rx).apply(','.join)

.apply(','.join) 会将列表转换为Col 列中的逗号分隔字符串。

图案的意思:

\b - 单词边界 \d1,2 - 1 位或 2 位数字 [-–—] - 连字符、em- 或 en-dash (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) - 任何 12 个月的缩写名称 [-–—] - 连字符、em- 或 en-dash (?:\d4|\d2) - 4 位或 2 位数字 \b - 单词边界

【讨论】:

谢谢,又是一个小问题……如果上下匹配,可以添加(?i)吗?例如:r'\b\d1,2[---]((?i)?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [---](?:\d4|\d2)\b' 在 Python re 中,内联 (?i) 修饰符的位置没有任何区别。如果你把它放在最后,它会使 whole 模式不区分大小写。使用rx = r'(?i)\b\d1,2[-–—](?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[-–—](?:\d4|\d2)\b' 感谢您的回答确实帮助我澄清了 extractall 问题

以上是关于pandas extractall() 没有提取给定正则表达式的所有案例?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas extractall() - 返回列表,而不是多级索引?

监控 Zip4J extractAll() 方法进度监控

将提取的列附加到没有索引的列表中:Pandas

xps坐标提取

将压缩文件提取到内存?

按单元格值提取 excel 数据:python PANDAS