gpt4 book ai didi

python - 在 python 中用 re.sub 替换特定的命名组

转载 作者:太空宇宙 更新时间:2023-11-03 16:18:19 26 4
gpt4 key购买 nike

我创建一个正则表达式来查找像 /places/:state/:city/whatever 这样的网址

p = re.compile('^/places/(?P<state>[^/]+)/(?P<city>[^/]+).*$')

这工作得很好:

import re

p = re.compile('^/places/(?P<state>[^/]+)/(?P<city>[^/]+).*$')
path = '/places/NY/NY/other/stuff'
match = p.match(path)
print match.groupdict()

打印 {'city': 'NY', 'state': 'NY'}

如何处理日志文件以将 /places/NY/NY/other/stuff 替换为字符串 "/places/:state/:city/other/stuff"?我想了解有多少个网址属于“城市类型”,而不关心这些地点具体是 (NY, NY)。

简单的方法可能会失败:

import re

p = re.compile('^/places/(?P<state>[^/]+)/(?P<city>[^/]+).*$')
path = '/places/NY/NY/other/stuff'
match = p.match(path)
if match:
groupdict = match.groupdict()
for k, v in sorted(groupdict.items()):
path = path.replace(v, ':' + k, 1)
print path

将打印 /places/:city/:state/other/stuff,这是向后的!

感觉应该有某种方法可以使用re.sub,但我看不到它。

最佳答案

想出了一个更好的方法来做到这一点。已编译的正则表达式上有一个属性groupindex,它在模式字符串中打印组及其顺序:

>>> p = re.compile('^/places/(?P<state>[^/]+)/(?P<city>[^/]+).*$')
>>> p.groupindex
{'city': 2, 'state': 1}

可以轻松地以正确的顺序进行迭代:

>>> sorted(p.groupindex.items(), key=lambda x: x[1])
[('state', 1), ('city', 2)]

使用这个,我应该能够保证以正确的从左到右的顺序替换匹配:

p = re.compile('^/places/(?P<state>[^/]+)/(?P<city>[^/]+).*$')
path = '/places/NY/NY/other/stuff'
match = p.match(path)
if match:
groupdict = match.groupdict()
for k, _ in sorted(p.groupindex.items(), key=lambda x: x[1]):
path = path.replace(groupdict[k], ':' + k, 1)
print path

这会按正确的顺序循环遍历组,从而确保替换也按正确的顺序发生,从而可靠地生成正确的字符串:

/places/:state/:city/other/stuff

关于python - 在 python 中用 re.sub 替换特定的命名组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38710363/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com