Python 3中的正则表达式问题
我有一个相当简单的正则表达式,但由于某些原因,它不能捕获所有实例 我的数据框如下所示(包括所有74行,因为我不知道问题发生在哪里): 如果我通过Python 3中的正则表达式问题,python,regex,pandas,Python,Regex,Pandas,我有一个相当简单的正则表达式,但由于某些原因,它不能捕获所有实例 我的数据框如下所示(包括所有74行,因为我不知道问题发生在哪里): 如果我通过 In [57]: len(df['Name']) 我明白了 Out [57]: 74 我创建了一个正则表达式,如下所示: p = re.compile('_[A-z][0-9][0-9][0-9]_') 我想创建一个列,其中看起来有点像“\u A122”或“\u A100”等的代码段是值。我想使用regex,因为我以后想将这段代码应用到一个更大的
In [57]: len(df['Name'])
我明白了
Out [57]: 74
我创建了一个正则表达式,如下所示:
p = re.compile('_[A-z][0-9][0-9][0-9]_')
我想创建一个列,其中看起来有点像“\u A122”或“\u A100”等的代码段是值。我想使用regex,因为我以后想将这段代码应用到一个更大的集合中,其中代码段并不总是出现在同一位置
当我使用以下命令时,结果是我要查找的表单的列表:
In [55]: p.findall(str(df['Name']))
Out[55]:
['_A100_',
'_A122_',
'_A100_',
'_A100_',
'_A122_',
'_A100_',
'_A100_',
'_A100_',
'_A122_',
'_A100_',
'_A100_',
'_A100_',
'_A100_',
'_A100_',
'_A100_',
'_A122_',
'_A100_',
'_A100_',
'_A100_',
'_A122_',
'_A100_',
'_A100_',
'_A100_',
'_A100_',
'_A100_',
'_A100_',
'_A100_',
'_A100_',
'_A100_',
'_A100_',
'_A100_',
'_A100_',
'_A100_',
'_A100_',
'_A100_',
'_A100_',
'_A100_',
'_A100_',
'_A100_',
'_A100_',
'_A100_',
'_A100_',
'_A100_',
'_A100_',
'_A100_',
'_A100_',
'_A122_',
'_A100_',
'_A122_',
'_A100_',
'_A100_',
'_A100_',
'_A122_',
'_A100_',
'_A100_',
'_A122_',
'_A100_',
'_A100_',
'_A100_',
'_A122_']
问题是,这份清单“太短”。使用len(p.findall(str(df['Name'])),我得到的结果是60。我看不出它缺了哪14行
我不习惯正则表达式,所以这可能是一个非常明显的错误,但我真的非常感谢任何帮助
(我想我可以做一个for循环并逐个单元格创建新的列,但我真的宁愿避免这样做,因为我以后会将此代码应用于更大的数据集,并且不希望它需要一百万年才能运行)IIUC您可以使用它来提取与您的正则表达式匹配的子字符串:
In [55]: df.Name.str.extract(r'(_[a-zA-Z]\d{3}_)', expand=False)
Out[55]:
0 _A122_
1 _A122_
2 _A122_
3 _A122_
4 _A122_
5 _A122_
6 _A122_
7 _A122_
8 _A122_
9 _A122_
...
64 _A100_
65 _A100_
66 _A100_
67 _A100_
68 _A100_
69 _A100_
70 _A100_
71 _A100_
72 _A100_
73 _A100_
Name: Name, dtype: object
PS您不应使用str(df['Name'])
,因为df的字符串表示形式将缩短:
In [58]: pd.options.display.max_rows = 4
In [59]: df
Out[59]:
Name
0 P0824AK03.VAK03_TK02_QE_A122_M
1 P0824AK03.VAK03_TK02_QE_A122_M
.. ...
72 P0824AK03.VAK03_TK02_QE_A100_M
73 P0824AK03.VAK03_TK02_QE_A100_M
[74 rows x 1 columns]
In [60]: str(df['Name'])
Out[60]: '0 P0824AK03.VAK03_TK02_QE_A122_M\n1 P0824AK03.VAK03_TK02_QE_A122_M\n ... \n72
P0824AK03.VAK03_TK02_QE_A100_M\n73 P0824AK03.VAK03_TK02_QE_A100_M\nName: Name, dtype: object'
你在用熊猫吗?如果是,请将标签添加到问题中。是的,对不起,我应该说。我使用的是pandas dataframeBTW,
[A-z]
,您需要使用[A-Za-z]
。感谢Wiktor,但是在这种情况下,结果不会改变,我的列表中仍然没有74个项目。我尝试这样做时,得到了类型错误:预期的字符串或类似object的字节。但现在问题已经得到了回答,问题也解决了:)它成功了,谢谢。你认为问题出在我错误地使用str(df['Name'])?@J.Dahlgren,不客气。是的,通常我们希望在处理Pandas数据帧时使用Pandas/NumPy/SciPy矢量化函数。正如我在回答中所显示的,Pandas将缩短str(df['Name'])
——以避免在屏幕上充斥数据。想象一下,如果你有一个DF和几个。十亿行-输出到屏幕的时间太长,str(df['Name'])
可能会导致内存错误。。。
In [58]: pd.options.display.max_rows = 4
In [59]: df
Out[59]:
Name
0 P0824AK03.VAK03_TK02_QE_A122_M
1 P0824AK03.VAK03_TK02_QE_A122_M
.. ...
72 P0824AK03.VAK03_TK02_QE_A100_M
73 P0824AK03.VAK03_TK02_QE_A100_M
[74 rows x 1 columns]
In [60]: str(df['Name'])
Out[60]: '0 P0824AK03.VAK03_TK02_QE_A122_M\n1 P0824AK03.VAK03_TK02_QE_A122_M\n ... \n72
P0824AK03.VAK03_TK02_QE_A100_M\n73 P0824AK03.VAK03_TK02_QE_A100_M\nName: Name, dtype: object'