我的文字如下:
sometext...one=1290...sometext...two=12985...sometext...three=1233...
如何找到one=1290
和two=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
?
答案 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)
定义预测 - 因此从匹配结果中排除。