Python 匹配子字符串中的字符串
Python matching strings within substrings
我正在编写一个程序来获取 json 格式的文件并创建一个代理 PAC 文件。我遇到的挑战之一是 json 文件包含混合的数据,这些数据组织不整齐。我想这样总结数据:
输入数据:
www.example.com
*.example.com
example.com
myserver.example.com
server.*.example2.com
server.mydomain1.example2.com
server.mydomain2.example2.com
server.mydomain3.example2.com
example2.com
输出数据:
*.example.com
example.com
server.*.example2.com
example2.com
我正在尝试找到最 python 的方式来总结数据。有任何想法吗?我想过使用正则表达式来帮助进行模式匹配,但我想它们会很快变得复杂?
我只能想出一个非常混乱的方法来做到这一点,但我会尝试用评论来解释。
import re
l = ["www.example.com",
"*.example.com",
"example.com",
"myserver.example.com",
"server.*.example2.com",
"server.mydomain1.example2.com",
"server.mydomain2.example2.com",
"server.mydomain3.example2.com",
"example2.com"]
# Something can only summarize if it contains a wildcard. Otherwise it won't represent the other elements in the list
summarizable = [domain for domain in l if "*" in domain]
[url for url in l
if not bool( # check to see if url is not represented by any of the wildcards
[1 for summary in summarizable # escape the ., replace * with re wildcard (.*)
if bool(re.match(summary.replace('.','\.').replace('*','.*'), url)) ])] + summarizable
returns
['example.com', 'example2.com', '*.example.com', 'server.*.example2.com']
此解决方案的注意事项:如果您有两个可以相互汇总的通配符 url,它们都会出现在最终输出中。
我正在编写一个程序来获取 json 格式的文件并创建一个代理 PAC 文件。我遇到的挑战之一是 json 文件包含混合的数据,这些数据组织不整齐。我想这样总结数据:
输入数据:
www.example.com
*.example.com
example.com
myserver.example.com
server.*.example2.com
server.mydomain1.example2.com
server.mydomain2.example2.com
server.mydomain3.example2.com
example2.com
输出数据:
*.example.com
example.com
server.*.example2.com
example2.com
我正在尝试找到最 python 的方式来总结数据。有任何想法吗?我想过使用正则表达式来帮助进行模式匹配,但我想它们会很快变得复杂?
我只能想出一个非常混乱的方法来做到这一点,但我会尝试用评论来解释。
import re
l = ["www.example.com",
"*.example.com",
"example.com",
"myserver.example.com",
"server.*.example2.com",
"server.mydomain1.example2.com",
"server.mydomain2.example2.com",
"server.mydomain3.example2.com",
"example2.com"]
# Something can only summarize if it contains a wildcard. Otherwise it won't represent the other elements in the list
summarizable = [domain for domain in l if "*" in domain]
[url for url in l
if not bool( # check to see if url is not represented by any of the wildcards
[1 for summary in summarizable # escape the ., replace * with re wildcard (.*)
if bool(re.match(summary.replace('.','\.').replace('*','.*'), url)) ])] + summarizable
returns
['example.com', 'example2.com', '*.example.com', 'server.*.example2.com']
此解决方案的注意事项:如果您有两个可以相互汇总的通配符 url,它们都会出现在最终输出中。