我有一个包含地址的熊猫数据框。有些格式正确,如481 Rogers Rd York ON
。其他人在城市象限和城市名称之间缺少空格,例如:101 9 Ave SWCalgary AB
甚至可能是:101 9 Ave SCalgary AB
,其中SW
指西南,而S
指南。
我正在尝试找到一个正则表达式,如果第二个和第三个大写字母后跟小写字母,或者如果只有2个大写字母后跟小写字母,请在第一个和第二个之间添加一个空格
到目前为止,我发现([A-Z]{2,3}[a-z])
可以正确匹配这种情况,但是我不知道如何回过头来查看它在位置2或3处的位置。理想情况下,我想使用索引在[-2:]
拆分匹配项,但我不知道该怎么做。
我发现re.findall('(?<=[A-Z][A-Z])[A-Z][a-z].+', '101 9 Ave SWCalgary AB')
将返回字符串的最后一部分,我可以使用前瞻正则表达式查找起点,然后加入它们,但这似乎效率很低。
谢谢
答案 0 :(得分:0)
您可以使用
([A-Z]{1,2})(?=[A-Z][a-z])
捕获第一个(或第一个和第二个)大写字母,然后使用大写字母lookahead后面跟一个小写字母。然后,用第一组和一个空格替换:
re.sub(r'([A-Z]{1,2})(?=[A-Z][a-z])', r'\1 ', str)
答案 1 :(得分:0)
您可以使用
\b
详细信息
([A-Z]{1,2})
-单词边界\1
-捕获组1(在替换模式中后来称为([A-Z][a-z])
):一个或两个大写字母\2
-捕获组2(在替换模式中后来称为df['Test'] = df['Test'].str.replace(r'\b([NS][EW]|[NESW])([A-Z][a-z])', r'\1 \2')
):大写字母+小写字母。如果要专门匹配城市象限 ,则可以使用更具体的正则表达式:
[NS][EW]|[NESW]
请参见this regex demo。在这里,N
与S
或E
匹配,后跟W
或N
,或单个E
,S
, W
或import pandas as pd
df = pd.DataFrame({'Test':['481 Rogers Rd York ON',
'101 9 Ave SWCalgary AB',
'101 9 Ave SCalgary AB']})
>>> df['Test'].str.replace(r'\b([A-Z]{1,2})([A-Z][a-z])', r'\1 \2')
0 481 Rogers Rd York ON
1 101 9 Ave SW Calgary AB
2 101 9 Ave S Calgary AB
Name: Test, dtype: object
。
熊猫演示:
<button class="toggle" value=10 id="bil">Bil<span class="togglePlus">+</span></button>
<button class="toggle" value=5 id="indbo">Indbo<span class="togglePlus">+</span</button>