如何在熊猫中合并正则表达式Findall的输出

问题描述 投票:0回答:1

我正在用Jupyter笔记本和熊猫一起探索正则表达式。我的目标是使用一组正则表达式模式从地址行中提取房屋编号添加项。

我正在此信息的基础上:https://gist.github.com/christiaanwesterbeek/c574beaf73adcfd74997我将其用于.csv的输入:

Afleveradres
Dorpstraat 2
Dorpstr. 2
Dorpstraat 2
Laan 1933 2
18 Septemberplein 12
Kerkstraat 42-f3
Kerk straat 2b
42nd street, 1337a
1e Constantijn Huigensstraat 9b
Maas-Waalweg 15
De Dompelaar 1 B
Kümmersbrucker Straße 2
Friedrichstädter Straße 42-46
Höhenstraße 5A  
Saturnusstraat 60-75
Saturnusstraat 60 - 75
Plein \'40-\'45 10
Plein 1945 1
Steenkade t/o 56
Steenkade a/b Twee Gezusters
1, rue de l\'eglise
Herestraat 49 BOX1043
Maas-Waalweg 15 15

我的目标是提取街道名,门牌号和门牌号。

到目前为止,我基本上使用:

# get data
file_base_name = 'examples'
dfa = pd.read_csv(''+file_base_name+'.csv', sep=';')

#get number
dfa['num'] = dfa['Afleveradres'].str.extract(r"([,\s]+\d+)\s*")
dfa['num'] = dfa['num'].str.strip()

# split leftover values into street & addition
dfa['tmp']=dfa.Afleveradres.str.replace(r"([,\s]+\d+)\s*", ';')

# new data frame with split value columns 
new = dfa["tmp"].str.split(";", n = 1, expand = True) 
# making separate first name column from new data frame 
dfa["str"]= new[0] 

# making separate last name column from new data frame 
dfa["add"]= new[1] 
dfa.drop(['tmp'], axis=1, inplace=True)


这导致:listing streenames, numbers & addition

;Afleveradres;str;add;num
0;Dorpstraat 2;Dorpstraat;;2
1;Dorpstr. 2;Dorpstr.;;2
2;Dorpstraat 2;Dorpstraat;;2
3;Laan 1933 2;Laan;2;1933
4;18 Septemberplein 12;18 Septemberplein;;12
5;Kerkstraat 42-f3;Kerkstraat;-f3;42
6;Kerk straat 2b;Kerk straat;b;2
7;42nd street, 1337a;42nd street;a;, 1337
8;1e Constantijn Huigensstraat 9b;1e Constantijn Huigensstraat;b;9
9;Maas-Waalweg 15;Maas-Waalweg;;15
10;De Dompelaar 1 B;De Dompelaar;B;1

到目前为止,到目前为止,一切都很好。接下来,我想更正门牌号范围,例如“ 42-46”和“ 60-65”。

A re.findall返回期望值:

import re

def rem(str):
    pattern = r'[,@\'?\.$%_]'
    if re.match(pattern, str):
        tmp = 'Y'
    else:
        tmp = 'N'
    return tmp

def extract_numrange(row):
    r = ''+row['Afleveradres']
    num_range1 = re.findall(r'([,\s]+\d+\-+\d+)\s*|([,\s]+\d+\s+\-+\s+\d+)\s*',r)

    return num_range1
    # return rem(num_range1)

dfa['excep'] = dfa.apply(extract_numrange, axis=1)
dfa

output re.findall

15  Friedrichstädter Straße 42-46   Friedrichstädter Straße -46 42  [( 42-46, )]
16  Höhenstraße 5A  Höhenstraße A   5   []
17  Saturnusstraat 60-75    Saturnusstraat  -75 60  [( 60-75, )]
18  Saturnusstraat 60 - 75  Saturnusstraat  -;  60  [(, 60 - 75)]

但是如何在新列中将[[42-46,)]和[(,60-75)]的输出清除为42-46和60- 75之类的东西?

还是我的问题有更好的方法?

regex jupyter findall
1个回答
0
投票

问题出在以下事实:有两个捕获组。您需要重新设置模式以仅使用一个捕获组,或者完全摆脱该组。

您的图案为(Group1)\s*|(Group2)\s*类型。如您所见,您所要做的就是将零件重新分组为(Group1|Group2)\s*

所以,最快的解决方法是

([,\s]+\d+\-+\d+|[,\s]+\d+\s+\-+\s+\d+)\s*

请参见regex demo

但是,我认为您不需要两端都使用空格。然后,将不想捕获的那些模式移出分组:

[,\s]+(\d+\-+\d+|\d+\s+\-+\s+\d+)\s*
^^^^^^

请参见this regex demo

© www.soinside.com 2019 - 2024. All rights reserved.