Python 使用正则表达式删除连续点之前的数字

Python 使用正则表达式删除连续点之前的数字,python,regex,Python,Regex,我有一个字符串Node57Name123.grpObject12.grp23Symbol43.shape52.anotherobject25.shape23 删除点之前和单词之后的所有数字 忽略字符串的第一部分,即“Node57Name123” 如果数字在单词内部,则不应删除它们 尝试了re.sub(r“\d+”,“”,string),但它每隔一个数字就删除一个 输出应如下所示“Node57Name123.grpObject.grp23Symbol.shape.anotherobject.sha

我有一个字符串
Node57Name123.grpObject12.grp23Symbol43.shape52.anotherobject25.shape23

  • 删除点之前和单词之后的所有数字
  • 忽略字符串的第一部分,即
    “Node57Name123”
  • 如果数字在单词内部,则不应删除它们
  • 尝试了
    re.sub(r“\d+”,“”,string)
    ,但它每隔一个数字就删除一个

    输出应如下所示
    “Node57Name123.grpObject.grp23Symbol.shape.anotherobject.shape”

    你能给我指一下正确的方向吗。

    你可以用

    re.sub(r'^([^.]*\.)|\d+(?![^.])', r'\1', text)
    

    详情:

    • ^([^.]*\)
      -除点以外的零个或多个字符,然后在捕获到组1中的字符串开头添加一个
      字符(从替换模式中以
      \1
      引用)
    • |
      -或
    • \d+(?![^.])
      -一个或多个数字后跟一个点或字符串结尾(
      (?=\。\124;$)
    见:

    你可以用

    re.sub(r'^([^.]*\.)|\d+(?![^.])', r'\1', text)
    

    详情:

    • ^([^.]*\)
      -除点以外的零个或多个字符,然后在捕获到组1中的字符串开头添加一个
      字符(从替换模式中以
      \1
      引用)
    • |
      -或
    • \d+(?![^.])
      -一个或多个数字后跟一个点或字符串结尾(
      (?=\。\124;$)
    见:


    只是给你一个非正则表达式的替代“使用”。我们可以向该函数提供一组字符,以便从字符串右侧删除,例如:
    rstrip('0123456789')
    。或者,我们也可以使用模块中的数字常量:

    印刷品:

    Node57Name123.grpObject.grp23Symbol.shape.anotherobject.shape
    
    Node57Name123.grpObject.grp23Symbol.shape.anotherobject.shape
    

    编辑:

    如果您必须使用常规模式,则以下内容似乎涵盖了您的示例:

    (\.[^.]*?)\d+\b
    
    替换为第一个捕获组,请参阅联机

    • -打开捕获组:
      • \..[^.]*?
        -一个文字点,后跟0+非点字符(惰性)
      • -关闭捕获组
    • \d+\b
      -将1+个数字匹配到单词边界
    样本:

    import re
    s = 'Node57Name123.grpObject12.grp23Symbol43.shape52.anotherobject25.shape23'
    x = re.sub(r'(\.[^.]*?)\d+\b', r'\1', s)
    print(x)
    
    印刷品:

    Node57Name123.grpObject.grp23Symbol.shape.anotherobject.shape
    
    Node57Name123.grpObject.grp23Symbol.shape.anotherobject.shape
    

    只是给你一个非正则表达式的替代“使用”。我们可以向该函数提供一组字符,以便从字符串右侧删除,例如:
    rstrip('0123456789')
    。或者,我们也可以使用模块中的数字常量:

    印刷品:

    Node57Name123.grpObject.grp23Symbol.shape.anotherobject.shape
    
    Node57Name123.grpObject.grp23Symbol.shape.anotherobject.shape
    

    编辑:

    如果您必须使用常规模式,则以下内容似乎涵盖了您的示例:

    (\.[^.]*?)\d+\b
    
    替换为第一个捕获组,请参阅联机

    • -打开捕获组:
      • \..[^.]*?
        -一个文字点,后跟0+非点字符(惰性)
      • -关闭捕获组
    • \d+\b
      -将1+个数字匹配到单词边界
    样本:

    import re
    s = 'Node57Name123.grpObject12.grp23Symbol43.shape52.anotherobject25.shape23'
    x = re.sub(r'(\.[^.]*?)\d+\b', r'\1', s)
    print(x)
    
    印刷品:

    Node57Name123.grpObject.grp23Symbol.shape.anotherobject.shape
    
    Node57Name123.grpObject.grp23Symbol.shape.anotherobject.shape
    

    天哪,你是救世主,不到几分钟,你就回答了。就个人而言,你能给我指一个更好地理解regex的指南吗?@PratikV I,因为很多人都问我同样的问题。天哪,你是救世主,不到几分钟,你就回答了。就个人而言,你能给我指一个更好地理解regex的指南吗?@PratikV I,因为很多人都问我同样的问题。