Python: 如何正则表达式输出同一行内的两个区域?

Python: How To Regex Out 2 Areas Within The Same Line?

xpath(//Edge[@Id='3' or @Id='74'])

你好,我想问一下如何做模拟正则表达式。

我想提取这两个数字:3 和 74

我也有我的正则表达式模式regex_1 = re.compile(".*Id='([0-9]*)'.*")

目的是用正则表达式输出 3 和 74,然后将每个结果存储到字典中 属性,它们仍然在相同的键值对中。

提取 id 值,并将它们作为值插入到新的字典结构中:

import re

text = "xpath(//Edge[@Id='3' or @Id='74'])"

pattern = re.compile(r".*Id='(\d+)'" * 2)

res = pattern.search(text)

print(res.groups())

new_storage = {
    "first_id": res.group(1),
    "second_id": res.group(2)
}

print(new_storage)

结果:

('3', '74')
{'first_id': '3', 'second_id': '74'}

您是否希望将所有数值作为列表提取到预定义键中?以下哪些适合您?

import re
s = "xpath(//Edge[@Id='3' or @Id='74'])"
d = {'id': re.findall(r"(?<=@Id=')\d+", s)}
print(d)

Returns:

{'id': ['3', '74']}

或者,如果它们必须 int 类型:

import re
s = "xpath(//Edge[@Id='3' or @Id='74'])"
d = {'id': list(map(int,re.findall(r"(?<=@Id=')\d+", s)))}
print(d)

Returns:

{'id': [3, 74]}

您可以使用 PyPi module 首先匹配模式的 xpath 部分,然后使用 \G 锚点进行迭代匹配。该数字在第 1 组中捕获。

(?:xpath\(//|\G(?!^))[^@]*@[^=]*='(\d+)'

部分

  • (?:非捕获组
    • xpath\(// 匹配 xpath(//
    • |
    • \G(?!^) 断言上一个匹配的结尾,而不是字符串的开头
  • ) 关闭群组
  • [^@]*@ 匹配除@之外的任何字符,然后匹配 @
  • [^=]*=' 匹配除 = 之外的任何字符,然后匹配 = 和开头的 '
  • (\d+) 捕获 组 1,匹配 1+ 个数字
  • ' 匹配 '

Regex demo | Python demo

示例代码

import regex

pattern = r"(?:xpath\(//|\G(?!^))[^@]*@[^=]*='(\d+)'"
s = "xpath(//Edge[@Id='3' or @Id='74'])"
print(regex.findall(pattern, s));

输出

['3', '74']