要求我为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,但却无法理解如何解决我的问题。
答案 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)
['123.145.167.0', '123.145.167.99']
答案 1 :(得分:1)
您可以使用前瞻断言:
pattern = r'123\.145\.167\.[0-9]{1,2}(?=[^0-9]|$)'
部分
(?=[^0-9]|$)
表示您只想检查,如果有非数字字符或字符串结尾。此检查不会"使用"任何字符只会影响表达式是否匹配。使用此方法findall
将提供您正在寻找的结果。
(?= ...)匹配如果...匹配下一个,但不消耗任何 串。这称为先行断言。例如,艾萨克 (?= Asimov)将匹配'Isaac'只有当它跟随阿西莫夫时才会出现。
答案 2 :(得分:0)
您需要为匹配定义边界。 123.145.167.10
在123.145.167.100
之内。您可以使用\b
标记来定义边界。
r"\b123\.145\.167\.[0-9]{1,2}\b"