使用正则表达式将字符串中的所有实例与多个组匹配

时间:2019-10-04 21:24:58

标签: regex python-3.x

我有一个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-']

2 个答案:

答案 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

See pyfiddle here for demonstration

答案 1 :(得分:0)

您可以使用re.findall方法来查找所有实例,而不仅仅是re.search那样。

re.findall不幸的是,还包括您的模式中包含的匹配组-带有括号的部分。

  

以字符串的形式返回字符串中所有不重复的模式匹配项   字符串。从左到右扫描字符串,并返回匹配项   按照找到的顺序。 如果模式中存在一个或多个组,   返回一个组列表; 如果该模式是一个元组列表   有一个以上的团体。空匹配项包含在结果中。

对于您的用例来说,re.finditer可能是一个更好的选择。