python re.sub如何使用它

时间:2015-03-31 06:05:08

标签: python regex

考虑字符串django-1.8.0.dist-info。我希望使用django==1.8.0将其转换为re.sub

我可以使用re.search.format的组合来完成它,但我想知道是否可以使用re.sub来实现。

我试过了:

re.sub(r"(?P<name>\w+)-(?P<version>[\d\.]+)", "\g<name>==\g<version>", "django-1.8.0.dist-info")返回django==1.8.0.dist-info

我希望借此机会学习正则表达式的新内容。

3 个答案:

答案 0 :(得分:3)

(?P<name>\w+)-(?P<version>[\d\.]+)\..*

使用此功能。也可以捕获最后一部分。参见演示。

https://regex101.com/r/sJ9gM7/23#python

答案 1 :(得分:2)

不确定你是否真的需要使用正则表达式,但你所追求的只是如下所示:

s="django-1.8.0.dist-info"

s=s.replace(".dist-info", "").replace('-','==')    

print(s)    # django==1.8.0  

一个正则表达式可能是:

import re
s="django-1.8.0.dist-info"
s = re.sub(r'^(\w+)-([\d\.]{5})(.+)', r'\1==\2', s)
print(s) # django==1.8.0

表达式为3组。

  • 第一组是-
  • 之前的字符
  • 第二组是5个字符(数字或点),版本号为
  • 第三组是休息

答案 2 :(得分:2)

您的正则表达式几乎确定,但您不想替换 - 您应该使用re.matchre.search

>>> "==".join(re.match(r"(?P<name>\w+)-(?P<version>[\d\.]+)", "django-1.8.0.dist-info").groups())
'django==1.8.0.'

正如@Avinash指出的那样 - 最后还有一个.

以下是修复正则表达式的一种方法(以及使用re.findall的示例):

>>> s = "django-1.8.0.dist-info"
>>> "==".join(*re.findall(r"(\w+)-(\d+(?:\.\d+)*)", s))
'django==1.8.0'

我遗漏了群组名称(希望)清晰度