解析字符串以获取特定字符前后的数字

时间:2018-07-20 19:00:11

标签: python regex

我正在尝试从该字符串中解析X之前和之后的数字,但是无法获取所有数字。有人可以帮我指出我在这里缺少什么吗?

>>> import re
>>> f = "abc_xyz1024X137M4B4abc_xyz"
>>> re.findall(".*\w+(\d+)X(\d+).*", f)
[('4', '137')]

2 个答案:

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

请参见Python demoregex demo

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