考虑字符串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
。
我希望借此机会学习正则表达式的新内容。
答案 0 :(得分:3)
(?P<name>\w+)-(?P<version>[\d\.]+)\..*
使用此功能。也可以捕获最后一部分。参见演示。
答案 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组。
-
答案 2 :(得分:2)
您的正则表达式几乎确定,但您不想替换 - 您应该使用re.match
或re.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'
我遗漏了群组名称(希望)清晰度