簡體   English   中英

在第二個或第三個大寫字母python之后插入空格

[英]Insert space after the second or third capital letter python

我有一個包含地址的熊貓數據框。 有些格式正確,例如481 Rogers Rd York ON 其他人在城市象限和城市名稱之間缺少空格,例如: 101 9 Ave SWCalgary AB甚至可能: 101 9 Ave SCalgary AB ,其中SW表示西南, S表示南。

我試圖找到一個正則表達式,如果第二個和第三個大寫字母后跟小寫字母,或者如果只有2個大寫字母后跟小寫字母,則在第二個和第三個大寫字母之間添加一個空格,請在第一個和第二個之間添加一個空格。

到目前為止,我發現([AZ]{2,3}[az])可以正確匹配這種情況,但是我無法弄清楚如何回過頭來查看它在位置2或3處的位置。我想使用索引在[-2:]處分割比賽,但我不知道該怎么做。

我發現re.findall('(?<=[AZ][AZ])[AZ][az].+', '101 9 Ave SWCalgary AB')將返回字符串的最后一部分,我可以使用期待正則表達式找到起點,然后加入他們,但這似乎效率很低。

謝謝

您可以使用

([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

您可以使用

df['Test'] = df['Test'].str.replace(r'\b([A-Z]{1,2})([A-Z][a-z])', r'\1 \2')

觀看此正則表達式演示

細節

  • \\b單詞邊界
  • ([AZ]{1,2}) -捕獲組1(后來在替換模式中以\\1 ):一個或兩個大寫字母
  • ([AZ][az]) -捕獲組2(在替換模式中后來用\\2 ):大寫字母+小寫字母。

如果要特別匹配城市象限 ,則可以使用更具體的正則表達式:

df['Test'] = df['Test'].str.replace(r'\b([NS][EW]|[NESW])([A-Z][a-z])', r'\1 \2')

請參閱此正則表達式演示 在這里, [NS][EW]|[NESW]匹配后跟EW NS或單個NESW

熊貓演示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM