【问题标题】:Insert space after the second or third capital letter python在第二个或第三个大写字母python之后插入空格
【发布时间】:2018-10-06 21:41:38
【问题描述】:

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

谢谢

【问题讨论】:

    标签: python regex pandas


    【解决方案1】:

    你可以使用

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

    this regex demo

    详情

    • \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')
    

    this regex demo。这里,[NS][EW]|[NESW] 匹配 NS,后面跟着 EW,或单个 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
    

    【讨论】:

      【解决方案2】:

      你可以使用

      ([A-Z]{1,2})(?=[A-Z][a-z])
      

      捕获第一个(或第一个和第二个)大写字母,然后对大写字母后跟小写字母使用前瞻。然后,替换为第一组和一个空格:

      re.sub(r'([A-Z]{1,2})(?=[A-Z][a-z])', r'\1 ', str)
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-12
        • 1970-01-01
        • 2022-11-04
        • 1970-01-01
        • 1970-01-01
        • 2022-08-23
        相关资源
        最近更新 更多