Python 在正则表达式中处于search()和findall()之间
一个要求我为IP地址创建正则表达式的个人项目导致了以下僵局Python 在正则表达式中处于search()和findall()之间,python,regex,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.16
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)
当使用search只匹配源字符串中的第一个元素时,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的匹配项
我已经做得很彻底了,但还不知道如何解决我的问题。最后抛出一个答案:\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.10
在123.145.167.100
范围内。您可以使用\b
标记定义边界
r"\b123\.145\.167\.[0-9]{1,2}\b"
您可以使用前瞻性断言:
角色
(?=[^0-9]|$)
这意味着您只想检查以下是否有非数字字符或字符串结尾。此检查不会“使用”任何字符,并且仅影响表达式是否匹配。通过这种方法,findall
将提供您想要的结果
从:
(?=…)匹配如果。。。匹配下一个,但不消耗任何
一串这称为前瞻断言。例如,艾萨克
(?=Asimov)仅当后跟“Asimov”时才与“Isaac”匹配
你可能想了解词的边界是什么。此外,
re.search()
和re.findall()
之间有一个基本的区别。
pattern = r'123\.145\.167\.[0-9]{1,2}(?=[^0-9]|$)'
(?=[^0-9]|$)