如何在 Pandas 中组合 Regex Findall 的输出
How to combine the Output of Regex Findall in Pandas
我正在 jupyter 笔记本中使用 pandas 探索正则表达式。
我的目标是使用一组正则表达式模式从地址线中提取 housenumberadditions。
我以此为基础post: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
returns 期望值:
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?
或者对于我的问题有更好的方法吗?
问题是因为有两个捕获组。您需要重新修改模式以仅使用一个捕获组,或者完全摆脱该组。
您的图案属于 (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。
可能,您可以进一步减少到
[,\s](\d+(?:-+|\s+-+\s+)\d+)
参见 this regex demo,(?:-+|\s+-+\s+)
是一个非捕获组,不会产生额外的元组项。
我正在 jupyter 笔记本中使用 pandas 探索正则表达式。 我的目标是使用一组正则表达式模式从地址线中提取 housenumberadditions。
我以此为基础post: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
returns 期望值:
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?
或者对于我的问题有更好的方法吗?
问题是因为有两个捕获组。您需要重新修改模式以仅使用一个捕获组,或者完全摆脱该组。
您的图案属于 (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。
可能,您可以进一步减少到
[,\s](\d+(?:-+|\s+-+\s+)\d+)
参见 this regex demo,(?:-+|\s+-+\s+)
是一个非捕获组,不会产生额外的元组项。