正则表达式返回元组而不是完整匹配

3
我正在尝试使用正则表达式在网站上找到代理地址。目前我正在使用这个正则表达式:(\d{1,3}\.){3}\d{1,3}:(\d+)。它可以在regexr.com和sublime text上运行,但当我在Python中使用时,结果不符合预期。
以下是我使用的代码:
p = re.compile("(\d{1,3}\.){3}\d{1,3}:(\d+)")
ipCandidates = p.findall(soupString)

它应该返回像这样的代理:120.206.182.172:8123,但它返回了元组,如下所示:('44.', '3128')。我该怎么办才能解决这个问题?谢谢。

你为什么要使用这些捕获组?你希望它们捕获什么?如果你想要非捕获组,那就用 (?:stuff) 而不是 (stuff) - user2357112
老实说,我不知道。我在网上找到了这个正则表达式,在除了Python之外的所有地方都完美运行。我对正则表达式并不是很熟练。 - The Wizard of Dos
1个回答

4

re.findall()仅返回捕获组的内容,而不是整个匹配(如果您的正则表达式中有这样的组)。

然后,您重复了一个捕获组三次,这意味着只有第三次重复被保留(其他两个被覆盖)。

将您的正则表达式更改为

p = re.compile(r"(?:\d{1,3}\.){3}\d{1,3}:\d+")

并且你将得到完整的匹配。

如果你确实想要没有点和冒号的单独子匹配元组,也可以这样做,但是就不能使用重复了:

p = re.compile(r"(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3}):(\d+)")

另外,在编写正则表达式时,一定要使用原始字符串(raw strings),以确保正则表达式的转义字符和字符串的转义字符不会混淆。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接