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+ 个数字
'
匹配 '
示例代码
import regex
pattern = r"(?:xpath\(//|\G(?!^))[^@]*@[^=]*='(\d+)'"
s = "xpath(//Edge[@Id='3' or @Id='74'])"
print(regex.findall(pattern, s));
输出
['3', '74']
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+ 个数字'
匹配'
示例代码
import regex
pattern = r"(?:xpath\(//|\G(?!^))[^@]*@[^=]*='(\d+)'"
s = "xpath(//Edge[@Id='3' or @Id='74'])"
print(regex.findall(pattern, s));
输出
['3', '74']