pandas.Series.str.extract 正则提取数据


pandas.Series.str.extract 

Series.str.extractselfpatflags = 0expand = True [来源]

提取的正则表达式捕获组拍作为一个数据帧列。

对于系列中的每个主题字符串,从正则表达式pat的第一个匹配中提取组。

参数:

pat : str

具有捕获组的正则表达式模式。

flags : int,默认为0(无标志)

来自re模块的标志,例如re.IGNORECASE,修改正则表达式匹配,例如大小写,空格等。有关详细信息,请参阅re

expand : bool,默认为True

如果为True,则返回DataFrame,每个捕获组一列。如果为False,如果有一个捕获组,则返回系列/索引;如果有多个捕获组,则返回DataFrame。

版本0.18.0中的新功能。

返回:

DataFrame或系列或索引

一个DataFrame,每个主题字符串有一行,每个组有一列。正则表达式pat中的任何捕获组名称都将用于列名称; 否则将使用捕获组编号。即使找不到匹配项,每个结果列的dtype也始终为object。如果 expand=False和pat只有一个捕获组,则返回一个系列(如果主题是系列)或索引(如果主题是索引)。

例子

具有两个组的模式将返回具有两列的DataFrame。不匹配将是NaN。

>>> s = pd.Series(['a1', 'b2', 'c3'])
>>> s.str.extract(r'([ab])(\d)')
     0    1
0    a    1
1    b    2
2  NaN  NaN

模式可以包含可选组。

>>> s.str.extract(r'([ab])?(\d)')
     0  1
0    a  1
1    b  2
2  NaN  3

命名组将成为结果中的列名。

>>> s.str.extract(r'(?P<letter>[ab])(?P<digit>\d)')
  letter digit
0      a     1
1      b     2
2    NaN   NaN

如果expand = True,则具有一个组的模式将返回一个具有一列的DataFrame。

>>> s.str.extract(r'[ab](\d)', expand=True)
     0
0    1
1    2
2  NaN

如果expand = False,则具有一个组的模式将返回Series。

>>> s.str.extract(r'[ab](\d)', expand=False)
0      1
1      2
2    NaN
dtype: object

需求: 将公司名称提取出来

# 测试数据

99778                 上海昌腾机电设备有限公司(销售部)
99812              上海昌达汽车配件有限公司(驻山东办事处)
99821                  上海昌金企业管理(集团)有限公司
99837                 上海昌雄机械设备有限公司(经营部)
99874                 上海明丹信息科技有限公司(市场部)
99878             上海明义木业有限公司(上海天廓建材经销部)
99885                 上海明乾物流有限公司 广 州分公司
99902                上海明伟家具厂&lt;销售部&gt;
99903                      上海明伟家具厂<销售部>
99917                   上海明先物资有限公司(销售部)
99922              上海明克包装公司 纸袋 纸塑复合袋 吨袋
99924                  上海明克包装制品有限公司 销售部
99925                 上海明克包装制品有限公司【销售部】
99940                    上海明凯电子有限公司 生产部
99947               上海明利模具五金钢材有限公司(销售部)
99948               上海明利模具五金钢材有限公司(销售部)
99971          上海明可得照明电器有限公司/文安县可得照明电器厂
99983            上海明和超音波股份有限公司(上海嘉定办事处)
99984              上海明和超音波设备有限公司(嘉定办事处)
99994                  上海明国(集团)塑胶制品有限公司
99996                  上海明圣酒店设备(维修)有限公司
99998                  上海明圣酒店设备(维修)有限公司

需要提取规范的数据:

99924      上海明克包装制品有限公司
99925      上海明克包装制品有限公司
99940        上海明凯电子有限公司
99947    上海明利模具五金钢材有限公司
99948    上海明利模具五金钢材有限公司
99971     上海明可得照明电器有限公司
99983     上海明和超音波股份有限公司
99984     上海明和超音波设备有限公司
99994  上海明国(集团)塑胶制品有限公司
99996  上海明圣酒店设备(维修)有限公司
99998  上海明圣酒店设备(维修)有限公司

按正则表示可以写成这样 

# 这是正则表达式
# 表示"xxxx有限公司", "(xxx)xxx"有限公司
"[\(\)()\u4e00-\u9fa5]+有限公司"

这里需要注意:

Series.str.extractselfpatflags = 0expand = True ) 

正则表达式需要改一改

# 需要改成这样
([\(\)()\u4e00-\u9fa5]+有限公司)

代码是这样的

# 按之前写的是匹配不出数据
# 这里的意思 [] 是匹配不到数据 [\(\)()\u4e00-\u9fa5]+ 
# 需要 在[]外在套一层()  ([\(\)()\u4e00-\u9fa5]+)

Series.str.extract('([\(\)()\u4e00-\u9fa5]+有限公司)')