Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 匹配熊猫中字符和数字的混合_Python_Regex_Pandas - Fatal编程技术网

Python 匹配熊猫中字符和数字的混合

Python 匹配熊猫中字符和数字的混合,python,regex,pandas,Python,Regex,Pandas,我需要从一个df中提取子字符串,并将它们放入一个新列中。 我使用的字符串如下所示: hj_yu_fb824_as22 jk_yu_fb638 我需要摘录: fb824 fb638 此外,它们的子字符串可以位于数据帧的两个独立列中(尽管只出现一次),因为df看起来像: col1 col2 mf_lp_gn817_ml46 d_nb_05340.gif desktop_300x250_mf mf_lp_fb824_ml46.html desktop_

我需要从一个df中提取子字符串,并将它们放入一个新列中。 我使用的字符串如下所示:

hj_yu_fb824_as22
jk_yu_fb638
我需要摘录:

 fb824
 fb638
此外,它们的子字符串可以位于数据帧的两个独立列中(尽管只出现一次),因为df看起来像:

col1                col2
mf_lp_gn817_ml46    d_nb_05340.gif 
desktop_300x250_mf  mf_lp_fb824_ml46.html 
desktop_300x250_mf  dd_lp_ig805.html 
desktop_728x90_mf   mf_lp_fb824_ml46.html 
我想获得如下信息:

col1                col2                     col3
mf_lp_gn817_ml46    d_nb_05340.gif           gn817
desktop_300x250_mf  mf_lp_fb824_ml46.html    fb824
desktop_300x250_mf  dd_lp_ig805.html         ig805
desktop_728x90_mf   mf_lp_fb824_ml46.html    fb824
因此,子字符串如下所示:

col1                col2
mf_lp_gn817_ml46    d_nb_05340.gif 
desktop_300x250_mf  mf_lp_fb824_ml46.html 
desktop_300x250_mf  dd_lp_ig805.html 
desktop_728x90_mf   mf_lp_fb824_ml46.html 
1) 开头两个小写字符,后跟3位数字 2) 在两个“”之间,或者只有一个“”,或者在“u”和“.”之间,还有别的吗

我想到了:

 \_([^()]*)\_
但它只匹配“s”之间的任何内容,而不考虑上面描述的模式

此外,如何有效地将正则表达式应用于数据帧

以下是可复制的数据帧:

df = DataFrame({'col1': {0: 'mf_lp_gn817_ml46',
 1: 'desktop_300x250_mf',
 2: 'desktop_300x250_mf',
 3: 'desktop_728x90_mf'},
 'col2': {0: 'd_nb_05340.gif ',
 1: 'mf_lp_fb824_ml46.html ',
 2: 'dd_lp_ig805.html ',
 3: 'mf_lp_fb824_ml46.html '},
 'col3': {0: 'gn817', 1: 'fb824', 2: 'ig805', 3: 'fb824'}})

可能需要更多的输入字符串,但对于上述字符串,您可以使用以下正则表达式:

_([a-z]{2}[0-9]{3})[_.]
# this is an underscore
# followed by exactly 2 letters and 3 digits
# followed by an underscore or a dot
# the whole match is captured to group1
对于上述字符串,这将是:

mf_lp_gn817_ml46    d_nb_05340.gif           -> gn817
desktop_300x250_mf  mf_lp_fb824_ml46.html    -> fb824
desktop_300x250_mf  dd_lp_ig805.html         -> ig805
desktop_728x90_mf   mf_lp_fb824_ml46.html    -> fb824

Python代码: 要将此应用于数据帧,请参阅以下代码:

import pandas as pd
from pandas import DataFrame
import re

df = DataFrame({'col1': {0: 'mf_lp_gn817_ml46',
 1: 'desktop_300x250_mf',
 2: 'desktop_300x250_mf',
 3: 'desktop_728x90_mf'},
 'col2': {0: 'd_nb_05340.gif ',
 1: 'mf_lp_fb824_ml46.html ',
 2: 'dd_lp_ig805.html ',
 3: 'mf_lp_fb824_ml46.html '}})

regex = r'_([a-z]{2}[0-9]{3})[_.]'
for index, row in df.iterrows():
    for column in row.keys():
        m = re.search(regex, row[column])
        if m is not None:
            df.ix[index, 'col3'] = m.group(1)
我从他的回答中学到了很多,非常优雅。我也遇到了这个额外的步骤,并认为我会有所贡献

保存生成的正则表达式对象以供重用更为有效(如果您执行的操作不止几项)。 见:6.2.2。模块内容

prog = re.compile(r'_([a-z]{2}[0-9]{3})[_.]')

for index, row in df.iterrows():
    for column in row.keys():
        m = prog.search(row[column])
        if m is not None:
            df.ix[index, 'col3'] = m.group(1)

这正是我需要的!但是,如何将其应用于两列,并在找到后在第三列中获取结果?@xxxvinxxx:查看更新的答案,使用jupyter笔记本进行测试。我仍然有点困惑m.group(1)如何最终丢失开头和结尾的下划线。