我正在尝试从该字符串中解析X
之前和之后的数字,但是无法获取所有数字。有人可以帮我指出我在这里缺少什么吗?
>>> import re
>>> f = "abc_xyz1024X137M4B4abc_xyz"
>>> re.findall(".*\w+(\d+)X(\d+).*", f)
[('4', '137')]
答案 0 :(得分:3)
请注意,.*\w+(\d+)X(\d+).*
首先会抓住尽可能多的0+字符(整个字符串),然后是试图与后续模式匹配的后架。 \w+
回溯到下一个字符是X
之前的数字的位置,因此第一个捕获组仅包含X
之前的一位数字,第二个捕获组包含之后的所有数字X
。选中this .*\w+(\d+)X(\d+).*
debugger page。
您应该只匹配并捕获数字,然后匹配X
,然后再次匹配并捕获数字。
您可以使用
import re
f = "abc_xyz1024X137M4B4abc_xyz"
print(re.findall(r"(\d+)X(\d+)", f))
# => [('1024', '137')]
或者,如果您仅对单个比赛感兴趣:
m = re.search(r"(?P<x>\d+)X(?P<y>\d+)", f)
if m:
print(m.groupdict()) # => {'y': '137', 'x': '1024'}
答案 1 :(得分:1)
在此特定示例中,另一种选择是在字符"X"
上分割字符串。然后在拆分的左半部分中找到最后一组连续数字,在拆分的右半部中找到第一组连续数字。
例如:
import re
f = "abc_xyz1024X137M4B4abc_xyz"
left, right = f.split("X")
print(right)
#137M4B4abc_xyz
print(left)
#abc_xyz1024
print((re.findall('\d+', left)[-1], re.findall('\d+', right)[0]))
#('1024', '137')