在第二个或第三个大写字母python之后插入空格

时间:2018-10-06 21:41:39

标签: python regex pandas

我有一个包含地址的熊猫数据框。有些格式正确,如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') 将返回字符串的最后一部分,我可以使用前瞻正则表达式查找起点,然后加入它们,但这似乎效率很低。

谢谢

2 个答案:

答案 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)

https://regex101.com/r/TcB4Ph/1

答案 1 :(得分:0)

您可以使用

\b

请参见this regex demo

详细信息

  • ([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。在这里,NSE匹配,后跟WN,或单个ESWimport 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>