在正则表达式中的search()和findall()之间达到中间点

时间:2014-05-26 06:01:10

标签: python regex

要求我为IP地址创建正则表达式的个人项目使我陷入了以下僵局。

pattern = r'123\.145\.167\.[0-9]{1,2}'
source = "123.145.167.0, 123.145.167.99, 123.145.167.100"
n = re.search(pattern, source)
print n.group()


pattern = r'123\.145\.167\.[0-9]{1,2}'
source = "123.145.167.0, 123.145.167.99, 123.145.167.100"
n = re.compile(pattern)
print n.findall(source)

虽然使用搜索仅匹配源字符串中的第一个元素,但findall通过提供诸如此类的输出来创建问题

['123.145.167.0', '123.145.167.99', '123.145.167.10']

我是否有可能获得123.145.167.0和123.145.167.99而不是123.145.167.100的匹配?

我已经彻底python - regex search and findall,但却无法理解如何解决我的问题。

3 个答案:

答案 0 :(得分:1)

在结尾处投掷word boundary\b

pattern = r'123\.145\.167\.[0-9]{1,2}\b'
source = "123.145.167.0, 123.145.167.99, 123.145.167.100"
n = re.compile(pattern)
print n.findall(source)

Gives:

['123.145.167.0', '123.145.167.99']

答案 1 :(得分:1)

您可以使用前瞻断言

pattern = r'123\.145\.167\.[0-9]{1,2}(?=[^0-9]|$)'

部分

(?=[^0-9]|$)

表示您只想检查,如果有非数字字符或字符串结尾。此检查不会"使用"任何字符只会影响表达式是否匹配。使用此方法findall将提供您正在寻找的结果。

来自documentation

  

(?= ...)匹配如果...匹配下一个,但不消耗任何   串。这称为先行断言。例如,艾萨克   (?= Asimov)将匹配'Isaac'只有当它跟随阿西莫夫时才会出现。

答案 2 :(得分:0)

您需要为匹配定义边界。 123.145.167.10123.145.167.100之内。您可以使用\b标记来定义边界。

r"\b123\.145\.167\.[0-9]{1,2}\b"