我有一个json转储,如下所示:
{
"field1": "1234b077-fb81-4d5b-adf3-123cdb1b56cf",
"field2": "111aa3f8-1cc3-4a75-9ad6-912a1d40781b",
"field3": "c2b75f2d-85ef-4c7c-a111-5d2a41442dc3",
"field4": "262d6922-53cf-4f9d-93b7-d6bae8711192"
}
还有一个正则表达式[0-9A-Fa-f]{8}-([0-9A-Fa-f]{4}-){3}[0-9A-Fa-f]{12}
我想用以下Python代码显示所有匹配项(实际上所有字段的值都匹配)
import re
regex = r'[0-9A-Fa-f]{8}-([0-9A-Fa-f]{4}-){3}[0-9A-Fa-f]{12}'
j = """{
"field1": "1234b077-fb81-4d5b-adf3-123cdb1b56cf",
"field2": "111aa3f8-1cc3-4a75-9ad6-912a1d40781b",
"field3": "c2b75f2d-85ef-4c7c-a111-5d2a41442dc3",
"field4": "262d6922-53cf-4f9d-93b7-d6bae8711192"
}"""
re.search(regex, j)
执行时,它只给我field1的值
<re.Match object; span=(24, 60), match='1234b077-fb81-4d5b-adf3-123cdb1b56cf'>
我不知道我是否想打印所有内容。
[已更新] re.findall()
没有得到预期的结果。
pattern = re.compile(regex)
re.findall(pattern, j)
无法预期结果,就像这样
['adf3-', '9ad6-', 'a337-', '93b7-']
答案 0 :(得分:1)
您可以使用re.finditer
遍历每个不重叠的事件:
import re
regex = r'[0-9A-Fa-f]{8}-([0-9A-Fa-f]{4}-){3}[0-9A-Fa-f]{12}'
data = """{
"field1": "1234b077-fb81-4d5b-adf3-123cdb1b56cf",
"field2": "111aa3f8-1cc3-4a75-9ad6-912a1d40781b",
"field3": "c2b75f2d-85ef-4c7c-a111-5d2a41442dc3",
"field4": "262d6922-53cf-4f9d-93b7-d6bae8711192"
}"""
for line in re.finditer(regex, data):
print(line.group(0))
打印:
1234b077-fb81-4d5b-adf3-123cdb1b56cf 111aa3f8-1cc3-4a75-9ad6-912a1d40781b c2b75f2d-85ef-4c7c-a111-5d2a41442dc3 262d6922-53cf-4f9d-93b7-d6bae8711192
答案 1 :(得分:0)
您可以使用re.findall
方法来查找所有实例,而不仅仅是re.search
那样。
re.findall
不幸的是,还包括您的模式中包含的匹配组-带有括号的部分。
以字符串的形式返回字符串中所有不重复的模式匹配项 字符串。从左到右扫描字符串,并返回匹配项 按照找到的顺序。 如果模式中存在一个或多个组, 返回一个组列表; 如果该模式是一个元组列表 有一个以上的团体。空匹配项包含在结果中。
对于您的用例来说,re.finditer
可能是一个更好的选择。