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

2024-04-28 08:39:07 发布

您现在位置:Python中文网/ 问答频道 /正文

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

  1. 删除点之前和单词之后的所有数字
  2. 忽略字符串的第一部分,即"Node57Name123"
  3. 如果数字在单词内部,则不应删除它们

尝试了re.sub(r"\d+","",string),但每隔一个数字就删除一个

输出应该如下所示"Node57Name123.grpObject.grp23Symbol.shape.anotherobject.shape"

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


Tags: 字符串restring数字单词shapeanotherobjectgrp23symbol
2条回答

只是为了给你一个非正则表达式的选择,使用^{}。我们可以为这个函数提供一组字符,以便从字符串的右侧删除,例如:rstrip('0123456789')。或者,我们也可以使用^{}模块中的数字常量:

from string import digits
s = 'Node57Name123.grpObject12.grp23Symbol43.shape52.anotherobject25.shape23'
x = '.'.join([s.split('.')[0]] + [i.rstrip(digits) for i in s.split('.')[1:]])
print(x)

印刷品:

Node57Name123.grpObject.grp23Symbol.shape.anotherobject.shape

编辑:

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

(\.[^.]*?)\d+\b

替换为第一个捕获组,请参阅联机demo

  • (-打开捕获组:
    • \.[^.]*?-一个文字点,后跟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

你可以用

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

regex demo

详细信息

  • ^([^.]*\.)-零个或多个字符,而不是一个点,然后在捕获到组1中的字符串的开头是一个.字符(在替换模式中用\1引用)
  • |-或
  • \d+(?![^.])-一个或多个数字后跟一个点或字符串结尾((?=\.|$)

Python demo

import re
text = r'Node57Name123.grpObject12.grp23Symbol43.shape52.anotherobject25.shape23'
print( re.sub(r'^([^.]*\.)|\d+(?![^.])', r'\1', text) )
## => Node57Name123.grpObject.grp23Symbol.shape.anotherobject.shape

相关问题 更多 >