python正则表达式查找带有数字的文本

时间:2017-07-04 07:34:09

标签: python regex

我的文字如下:

sometext...one=1290...sometext...two=12985...sometext...three=1233...

如何找到one=1290two=12985但不能找到三个,四个或五个? =之后可以有4到5位数字。我试过这个:

import re
pattern = r"(one|two)+=+(\d{4,5})+\D"
found = re.findall(pattern, sometext, flags=re.IGNORECASE)
print(found)

它给我的结果如下:[('one', '1290')]。 如果我使用pattern = r"((one|two)+=+(\d{4,5})+\D)",它会给我[('one=1290', 'one', '1290')]。我怎样才能得到one=1290

3 个答案:

答案 0 :(得分:4)

你很亲密。您需要使用单个捕获组(或者不使用任何一个):

((?:one|two)+=+\d{4,5})+

完整代码:

import re

string = 'sometext...one=1290...sometext...two=12985...sometext...three=1233...'

pattern = r"((?:one|two)+=+\d{4,5})+"
found = re.findall(pattern, string, flags=re.IGNORECASE)
print(found)
# ['one=1290', 'two=12985']

答案 1 :(得分:1)

使内部群组无法捕捉:((?:one|two)+=+(?:\d{4,5})+\D)

答案 2 :(得分:1)

您获得[('one', '1290')]而不是one=1290等结果的原因是因为您使用的是捕获群组。使用:

r"(?:one|two)=(?:\d{4,5})(?=\D)"
  • 我删除了额外的+转发器,因为它们(我认为?)是不必要的。您不想匹配oneonetwo===1234之类的内容,对吧?
  • 使用(?:...)而不是(...)定义非捕获组。这可以防止返回捕获的结果,而是让您获得整个匹配。
  • 同样,使用(?=\D)定义预测 - 因此从匹配结果中排除。